问题描述
我有一个提供程序的GUID,在Dotnet中,我如何侦听该提供程序生成的所有事件? 我有两个外部工具可以监听,一个是SDK的tracelog,我可以运行
request({
url: "http://webservice.xxxxxxxxx.com.br/",method: "POST",headers: {
"content-type": "application/xml",// <--Very important!!!
},body: myXMLText
},function (error,response,body){
})
.pipe(fs.createWriteStream('onix.zip')) //salvo o arquivo zip
.on('finish',()=>{
console.log('Arquivo baixado do WebService')
fs.createReadStream('onix.zip')
.pipe(unzipper.Parse())
.on('entry',function (entry) {
console.log('Descompactando arquivo')
const fileName = entry.path;
const type = entry.type; // 'Directory' or 'File'
const size = entry.vars.uncompressedSize; // There is also compressedSize;
console.log(fileName)
entry.pipe(fs.createWriteStream('output/onix.xml')
.on('error',err => console.log('error',err.message))
.on('ready',()=>{
console.log('Lendo arquivo')
fs.createReadStream('output/onix.xml')
.on('data',function (chunk) {
//console.log('aqui4')
xml+=chunk.toString()
//console.log(xml);
})
.on('end',function (chunk) {
//console.log(xml)
console.log('Convertendo de XML p/ JSON')
result = convert.xml2js(xml,{alwaysChildren: true}); // or convert.xml2json(xml,options)\
console.log('Preparando sql STATMENT | '+result.elements[0].elements.length+' LINHAS')
sql='';
for(i=0;i<result.elements[0].elements.length;i++){//trocar o 5 por result.elements[0].elements.length
table=''
value=''
for(j=0;j<result.elements[0].elements[i].elements.length;j++){
//sql += (result.elements[0].elements[i].elements[j].name);
//console.log(JSON.parse(result.elements[0].elements[i].elements[j].elements));
try{
if(result.elements[0].elements[i].elements[j].name.toLowerCase()=='rod' || result.elements[0].elements[i].elements[j].elements[0].text==null){
}else{
table += result.elements[0].elements[i].elements[j].name.toLowerCase()+(j==(result.elements[0].elements[i].elements.length-1)?'':',')
value += "'"+result.elements[0].elements[i].elements[j].elements[0].text.replace('\'',' ').replace('true','1').replace('false','0')+"'"+(j==(result.elements[0].elements[i].elements.length-1)?'':',')
}
}catch{
}
}
sql += 'INSERT INTO onixsat (' + table + ') VALUES (' + value + ')'
sql+=';\n'
}
console.log('Executando sql')
//console.log(sql)
})
})
)
})
})
此工具仅启用提供者并返回。然后,我运行另一个自定义/专用工具(用C ++编写),该工具收集事件并将它们记录到格式漂亮的表中的文件中。 我试图将所有这些都移植到我的dotnet应用程序中,但是我无法监听来自此给定提供程序的事件。 我尝试查看EventProviderTraceListener的MSDN文档,那里有一个代码示例,但我不知道该怎么使我能够侦听任意提供程序。 我还看到了this post about TraceEventSession,我曾尝试尝试以下代码:
tracelog -start <providerName> -b 8192 -seq 2000 -f somefile.bin -guid #00000000,1111,2222,3333,444444555555
调用回调,但是对于不同的提供程序GUID和我的提供程序不应该发送的事件名称,仅调用两次(事件名称为 EventTrace / BuildInfo 和 EventTrace / DbgIdRsds )。 我还看过at this documentation,它显示了如何实时侦听内核提供程序的事件,并且看起来我的代码做了相同的事情(尽管对于非标准提供程序)。
我为什么要得到这两个事件,我怎么能
- 启用事件以监听我拥有其GUID的提供者,并且
- 仅捕获来自该提供者的所有事件? (提供者可能正在从usermode和/或kernelmode发出事件,我不知道这是否有区别)
当我运行单独的工具时,收集工作正常,并且所有事件都被捕获而没有问题(它们每秒都非常频繁地生成,因此不必等待足够长的时间就没关系了。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)