企业库日志记录:如何使用每个日志条目打印方法名称和行号。

时间:2011-10-29 20:48:37

标签: enterprise-library

是否有预定义的方法来执行此操作,还是需要定义自己的自定义格式化程序?

2 个答案:

答案 0 :(得分:3)

您不会说您使用的是哪个版本的EntLib,但考虑到您的帖子日期,我将假设使用EntLib 5.0。

您感兴趣的格式字符串部分是:

Extended Properties: {dictionary({key} - {value}{newline})}

这是配置文件中找到的“默认”格式化程序模板的一部分,如下所示:

    <formatters>
        <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" template="Timestamp: {timestamp}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Title:{title}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}" name="Text Formatter" />
  </formatters>

因此,您可以看到扩展属性是一个字典,在创建日志条目时,Logger将自动迭代该字典。它的目的是提供一种快速而肮脏的方式来转储应用程序可能提供的额外输出。更完整的方法是编写一个自定义格式化程序,该格式化程序专门为每个要添加到扩展属性的对象提供令牌。

要获取此集合中的属性,只需使用

的相应重载
LogWriter.Write(..)

进行输入时的方法。其中一些人有

IDictionary(key, string) properties

可用于提供这些值的参数。

至于行号和方法名称,这些只能插入上面提供的词典中。要获得他们的价值,您可以:

   private void FillExtraLogInfo(IDictionary<string, object> info)
    {
        StackFrame stackFrame = new StackFrame(1, true);
        info.Add("Method Name", stackFrame.GetMethod().ToString());
        info.Add("Line Number" stackFrame.GetFileLineNumber());
    }

答案 1 :(得分:-1)

您可以通过在配置文件中配置TextFormatter来获取方法名称。我已经包含了整个格式化程序来为您提供一些上下文,但要找的关键是模板属性中的 {property(MethodName)} 。我不知道如何获得行号。

<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
    <formatters>
        <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
        template="Timestamp: {timestamp}{newline}&#xA;Title: {title}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}&#xA;Type: {property(TypeName)}{newline}&#xA;Method: {property(MethodName)}{newline}&#xA;Parameters: {dictionary({key} : {value};)}{newline}&#xA;Return Value: {property(ReturnValue)}{newline}&#xA;Call Time: {property(CallTime)}{newline}" 
        name="Detailed Text Formatter" />
    </formatters>
</loggingConfiguration>

关于Configuring Formatters的MSDN文章提到了这些特殊令牌,但遗憾的是没有解释如何使用它们。