- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用企业库跟踪和异常日志记录时遇到了意外问题。我注意到的是,当我使用“App.Config”中的类别过滤器调低跟踪日志记录时,我无意中关闭了发生在我过滤到的跟踪日志记录级别以下的错误的错误日志记录。
例如:
Private Sub ProcA()
Using (New Tracer("Trace High Level")
Try
<Do some logic here>
ProcB()
Catch ex AS Exception
Dim rethrow As Boolean = ExceptionPolicy.HandleException(ex, "Log Only Policy")
If rethrow Then
Throw ex
End If
End Try
End Using
End Sub
Private Sub ProcB()
Using (New Tracer("Trace Mid Level")
Try
<Do some logic here>
ProcC()
Catch ex AS Exception
Dim rethrow As Boolean = ExceptionPolicy.HandleException(ex, "Log Only Policy")
If rethrow Then
Throw ex
End If
End Try
End Using
End Sub
Private Sub ProcC()
Using (New Tracer("Trace Low Level")
Try
Throw New Exception("Test error logging")
Catch ex AS Exception
Dim rethrow As Boolean = ExceptionPolicy.HandleException(ex, "Log Only Policy")
If rethrow Then
Throw ex
End If
End Try
End Using
End Sub
现在,如果我在 App.Config 中设置了我的类别过滤器以允许完全跟踪,我就会将我的所有跟踪消息和 ProcC 中抛出的错误消息写入我的日志。但是,如果我调低跟踪以仅记录 “Trace High Level”
,例如,我会收到我的高级跟踪消息,但不会记录 ProcC 中抛出的错误。
我已经逐步检查了代码并注意到在 ProcC 中出现错误时 LogEntry
的累积类别包括 "Trace High Level"、"Trace Mid Level"、 “跟踪低级别”
和 “错误”
。因此,只要我没有跟踪记录我的所有级别,对 LogWriterImpl.cs 中的 ShouldLog()
的调用就会返回 false,结果是我的错误不是已记录。
我的问题:
在这种情况下,有没有办法配置企业库日志记录,即使我没有在所有级别进行详细的跟踪日志记录,仍然允许记录错误?
回应@Tuzo 的评论:
<exceptionHandling>
<exceptionPolicies>
<add name="Exception Policy">
<exceptionTypes>
<add name="Exception" type="System.Exception, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
postHandlingAction="NotifyRethrow">
<exceptionHandlers>
<add name="Exception Logging" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging"
logCategory="Error" eventId="666" severity="Error" title="REPSS .Net Exception Handler"
formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling"
priority="1" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
<add name="Log Only Policy">
<exceptionTypes>
<add name="Exception" type="System.Exception, mscorlib" postHandlingAction="None">
<exceptionHandlers>
<add name="Exception Logging" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging"
logCategory="Error" eventId="666" severity="Error" title="REPSS .Net Exception Handler"
formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling"
priority="2" />
</exceptionHandlers>
</add>
</exceptionTypes>
</add>
</exceptionPolicies>
<loggingConfiguration name="Logging Application Block" tracingEnabled="true"
defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
<listeners>
<add name="Database Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.Database.FormattedDatabaseTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging.Database"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Database.Configuration.FormattedDatabaseTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging.Database"
databaseInstanceName="ReiApplicationLogging" writeLogStoredProcName="WriteLog"
addCategoryStoredProcName="AddCategory" formatter="Database Rei Applications Logging Formatter"
traceOutputOptions="None" />
<add name="Formatted EventLog TraceListener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.FormattedEventLogTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.FormattedEventLogTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging"
source="REPSS .Net" formatter="Text Formatter" log="REI Applications"
machineName="" traceOutputOptions="LogicalOperationStack" />
<add name="SDSCellPhone" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EmailTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.EmailTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging"
toAddress="sstudy@flexifloat.com" fromAddress="sstudy@flexifloat.com"
subjectLineStarter="REPSS .Net: " subjectLineEnder="(sms forward)"
smtpServer="REISRV05" smtpPort="25" formatter="Cell Phone Formatter"
authenticationMode="WindowsCredentials" traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack"
filter="Off" />
<add name="Rolling Flat File Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=null"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=null"
fileName="C:\Users\sstudy\Documents\Visual Studio Projects\_Production\Win Forms\REPSS\REPSS .Net Solution\RepssDN\repps net rolling error.log"
footer="^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"
formatter="Text Formatter" header="vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv"
rollInterval="Week" traceOutputOptions="LogicalOperationStack, Callstack" />
</listeners>
<formatters>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
template="Timestamp: {timestamp(local:F)}
Title:{title}
Machine: {machine}"
name="Cell Phone Formatter" />
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
template="{newline}{newline}________________________

Timestamp: {timestamp(local:F)}

Title:{title}
Process: {processName}

Extended Properties: 

{dictionary({key} - {value}

)}{newline}

Category: {category}

Priority: {priority}

EventId: {eventid}

Severity: {severity}

Machine: {machine}

Application Domain: {processName}

{newline}

Message: {message}

{newline}"
name="Database Rei Applications Logging Formatter" />
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
template="Timestamp: {timestamp(local:F)}
Title:{title}
Message: {message}
{newline}
Category: {category}
Priority: {priority}
EventId: {eventid}
Severity: {severity}
Machine: {machine}
Application Domain: {processName}
Process Id: {processId}
Process Name: {processName}
Win32 Thread Id: {win32ThreadId}
Thread Name: {threadName}
{newline}
Extended Properties: 
{dictionary({key} - {value}
)}"
name="Text Formatter" />
</formatters>
<logFilters>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.LogEnabledFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=null"
enabled="true" name="Enable All Logging" />
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.CategoryFilter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=null"
categoryFilterMode="AllowAllExceptDenied" name="Trace Filter">
<categoryFilters>
<add name="Trace Insane Detail" />
<add name="Trace Low Level" />
</categoryFilters>
</add>
</logFilters>
<categorySources>
<add switchValue="Error" name="Development Error">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
<add name="SDSCellPhone" />
</listeners>
</add>
<add switchValue="Error" name="Error">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
<add name="SDSCellPhone" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Feature Usage">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="All" name="General">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="All" name="Security">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Trace Start Up">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Trace Shut Down">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Trace Menu Item Selected">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Trace High Level">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Trace Mid Level">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Trace Low Level">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Trace Detail">
<listeners>
<add name="Database Trace Listener" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Trace Insane Detail">
<listeners>
<add name="Database Trace Listener" />
</listeners>
</add>
<add switchValue="All" name="Trace">
<listeners>
<add name="Rolling Flat File Trace Listener" />
</listeners>
</add>
<add switchValue="Verbose" name="Useful Info">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
</categorySources>
<specialSources>
<allEvents switchValue="All" name="All Events">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</allEvents>
<notProcessed switchValue="All" name="Unprocessed Category">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</notProcessed>
<errors switchValue="All" name="Logging Errors & Warnings">
<listeners>
<add name="Database Trace Listener" />
<add name="SDSCellPhone" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</errors>
</specialSources>
</loggingConfiguration>
尝试使用@Tuzo推荐的“SourceLevel”:
@Tuzo,我尝试了“SourceLevel”开关并修改了 app.config 以“关闭”较低级别的跟踪类别。有趣的是,这会产生相反的问题。由于跟踪链接在一起,EntLib 看到链中至少有一个跟踪类别不是“关闭”(在我的测试用例中,“跟踪高级”)并继续并在较低级别。
此 EntLib 逻辑在 LogWriterImpl 类的 ProcessLog() 中进行编码。
最终结果是所有较低级别的跟踪现在都已记录,即使它们已关闭。从好的方面来说,我现在确实记录了我的错误。 ;)
我想我会看一下您推荐的自定义过滤器,看看我是否可以让它适用于这种情况。
最佳答案
您看到的行为似乎是设计使然。
如果存在过滤器,则 LogEntry
必须成功通过所有过滤器。与类别过滤器类似,如果您指定 AllowAllExceptDenied
并且其中一个类别出现在日志条目中,则它不会通过类别过滤器并且不会记录消息。
“告诉我一些我还不知道的事情”,你在说。 :)
我可以想到 2 种方法来解决这个问题:
源级别
您可以使用 SourceLevel(开关值)代替通过过滤器启用和禁用事件跟踪。例如,删除您的过滤器,但对于听众“Trace Insane Detail”和“Trace Low Level”(如在您的过滤器中),将 switchValue 设置为 Off;您仍然可以启用“Trace Mid Level”。
<add switchValue="Off" name="Trace Insane Detail">
<listeners>
<add name="Database Trace Listener" />
</listeners>
</add>
<add switchValue="ActivityTracing" name="Trace Mid Level">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
<add switchValue="Off" name="Trace Low Level">
<listeners>
<add name="Database Trace Listener" />
<add name="Formatted EventLog TraceListener" />
</listeners>
</add>
自定义过滤器几乎可以让您做任何您想做的事情。它更复杂,所以只有在绝对必要时才应该这样做。参见 Using Custom Filters in the Enterprise Library Logging Block一个很好的例子。
关于.net - 使用 Ent-Lib 拨号跟踪的意外后果,没有错误记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460026/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
当我尝试在 db2 中创建表时,它抛出以下错误 $ db2 CREATE TABLE employee(emp_id INT NOT NULL, emp_name VARCHAR(100)) sh:
我有: while (i < l) { if (one === two) { continue; } i++; } 但是 JSLint 说: Problem at line 1 chara
所以我有这个代码: char inputs[10] = ""; int numInputs = 0; while (numInputs < 10){ char c; printf("E
var ninja = { name: 'Ninja', say: function () { return 'I am a ' + this.name; }
我收到一个我不明白的错误,请注意,我是编码新手,所以这可能是一个简单的错误。 #include using namespace std; int main() { //Initialise Fahr
我正在使用 javascript 和 react,由于某种原因,我收到了一个奇怪的 token 错误。 这是发生错误的代码: renderNavBar() { if (!this.us
Closed. This question is off-topic。它当前不接受答案。
由于某种我无法解释的原因,编译器正在输出一个错误,指出它发现了一个意外的#else 标记。 这发生在文件的开头: #if defined( _USING_MFC ) #include "stda
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这个问题在这里已经有了答案: Difference between sh and Bash (11 个答案) 关闭 2 年前。 我正在编写一个简单的 bash 脚本,我在 XX `(' unexpe
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic
我在 Windows 7 上编写了一个脚本,它不断给我一个错误“(此时出乎意料。”对于以下代码 if %vardns%=="NODNS" ( netsh interface ipv4 set ad
我正在尝试使用xmlstarlet(使用xpath)解析XML文件,但是出现语法错误,并且我不知道如何更正我的代码。 这是我的脚本: #!/bin/bash if [ $1=="author" ];
以下脚本旨在在目录中的所有文件上运行程序“senna”,并将每个文件的输出(保留输入文件名)写入另一个目录 for file in ./Data/in/*; do ./senna -iobta
我从 challengers.coffee 运行此代码,并收到错误 ActionView::Template::Error (SyntaxError: [stdin]:3:31:unexpected
我在 config.db.database; 行中有语法错误(意外的标记“.”)。这是我在文件中的代码 const config = require('../config/config') const
这一定很明显,但是我无法使它正常工作。我正在尝试传输应该用于构建$ classKey的对象,这反过来又导致删除所需的软件(amd64或i386)。好吧,这里的代码: $name = @("softwa
我正在使用 1.3.7 版学习 Grails,但我一直无缘无故地遇到以下语法错误: unexpected token: mapping @ line x, column y. 有一次,我通过运行“gr
我正在尝试找出这段Pascal代码的问题 function Factorial(n: integer): integer; begin if n = 0 then Result := 1
我是一名优秀的程序员,十分优秀!