企业库日志记录阻止滚动平面文件未写入文件

本文关键字:文件 平面文件 滚动 日志 记录 企业库 | 更新日期: 2023-09-27 18:33:45

我正在使用 ASP.NET MVC 5 用于 Web 堆栈和 WebApi 2.2 用于后端服务堆栈实现多层 Web 解决方案。 部署时,它们将位于不同的服务器上,但在本地运行两个不同的开发进程 - Windows 7 和 IIS 7.5。 我正在尝试使用企业库 6 日志记录应用程序块在两个进程中实现滚动平面文件跟踪侦听器。 我有一个包含我的 Log 类的公共项目,它将保留自己的单例实例 - 其中对记录器的所有访问都将是:

public sealed class Log : ILog
{
    private static readonly Log m_log;
    static Log()
    {
        var factory = new LogWriterFactory();
        Logger.SetLogWriter(factory.Create());
        m_log = new Log();
    }
    private Log() // no one else can create
    { }
    public static ILog Instance { get { return m_log; } }
    public bool IsLoggingEnabled()
    {
        return Logger.IsLoggingEnabled();
    }
    public void Critical(object caller, string method, string message)
    {
        if (Logger.IsLoggingEnabled())
            Write(caller, method, message, TraceEventType.Critical);
    }
    public void Error(object caller, string method, string message)
    {
        if (Logger.IsLoggingEnabled())
            Write(caller, method, message, TraceEventType.Error);
    }
    public void Warning(object caller, string method, string message)
    {
        if (Logger.IsLoggingEnabled())
            Write(caller, method, message, TraceEventType.Warning);
    }
    public void Information(object caller, string method, string message)
    {
        if (Logger.IsLoggingEnabled())
            Write(caller, method, message, TraceEventType.Information);
    }
    private void Write(object caller, string method, string message, TraceEventType severity = TraceEventType.Information)
    {
        var entry = new LogEntry();
        entry.Severity = severity;
        if (Logger.ShouldLog(entry))
        {
            entry.TimeStamp = DateTime.Now;
            entry.Message = message;
            entry.ExtendedProperties.Add("Type", caller.GetType().Name);
            entry.ExtendedProperties.Add("Method", method);
            ...
            Logger.Write(entry);
        }
    }
}

以下是两个进程完全相同的配置,除了写入的文件名(MVC 写入 Web.log和 WebApi 写入 WebApi.log(:

<loggingConfiguration name="loggingConfiguration" tracingEnabled="true" defaultCategory="General" logWarningsWhenNoCategoriesMatch="true">
<logFilters>
  <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Filters.LogEnabledFilter, Microsoft.Practices.EnterpriseLibrary.Logging"
      enabled="true" name="Logging Enabled Filter" />
</logFilters>
<listeners>
  <add name="Rolling Flat File Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.RollingFlatFileTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging"
    listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.RollingFlatFileTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging"
    fileName="C:'Logs'WebApi.log"
    footer="" formatter="Text Formatter" header=""
    rollFileExistsBehavior="Increment" rollInterval="Midnight"
    timeStampPattern="yyyy-MM-DD" maxArchivedFiles="7"
    traceOutputOptions="LogicalOperationStack, DateTime, Timestamp, ProcessId, ThreadId, Callstack"
    filter="All" />
</listeners>
<formatters>
  <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
    template="Timestamp:{timestamp} Severity:{severity} Message:{message} Machine:{machine} ProcessId:{processId} ThreadId:{win32ThreadId}{dictionary( {key}:{value})}"
    name="Text Formatter" />
</formatters>
<categorySources>
  <add switchValue="All" name="General" autoFlush="true">
    <listeners>
      <add name="Rolling Flat File Trace Listener" />
    </listeners>
  </add>
</categorySources>
<specialSources>
  <allEvents switchValue="All" name="All Events">
    <listeners>
      <add name="Rolling Flat File Trace Listener" />
    </listeners>
  </allEvents>
  <notProcessed switchValue="All" name="Unprocessed Category">
    <listeners>
      <add name="Rolling Flat File Trace Listener" />
    </listeners>
  </notProcessed>
  <errors switchValue="All" name="Logging Errors &amp; Warnings">
    <listeners>
      <add name="Rolling Flat File Trace Listener" />
    </listeners>
  </errors>
</specialSources>

WebApi 堆栈使用 Unity 对所有控制器依赖项执行 DI。 我的单一实例正在正确解析并注入到我所有控制器都派生自的 ApiController 基类中。 我有一个操作过滤器,它试图在 onActionExecutingAsync 和 onActionExecutedAsync 事件中写入日志。

问题是:WebApi

进程没有将条目写入 WebApi.log 文件。 该过程创建文件;它只是没有在那里写任何东西。我很确定我一开始就在那里写了一些东西,但我只是无法让它在那里记录任何东西了。 我已经逐步完成了调试器,IsLoggingEnabled(( 返回 true,并调用了 Logger.Write 方法。 我尝试撤消前端日志记录块的所有引用,认为在同一台机器上的多个进程中运行该块存在问题。没有变化。 前端 MVC 进程正在创建并记录到 Web.log 文件(再次,相同的配置(。 有人知道我错过了什么吗? 提前谢谢。

企业库日志记录阻止滚动平面文件未写入文件

日志记录应用程序块存在一个已知问题,如果扩展属性值为 null,则条目 LogEntry 将失败且不会记录。

如果为任何扩展属性值传入 null,请尝试更改代码以写入空字符串。 例如:

entry.ExtendedProperties.Add("Method", method ?? String.Empty);

这应该避免遇到问题。