企业库记录块滚动平面文件不写入文件
Enterprise Library Logging Block Rolling Flat File Not Writing to File
我正在实施一个多层 Web 解决方案,使用 ASP.NET Web 堆栈的 MVC 5 和后端服务堆栈的 WebApi 2.2。这些将在部署时位于不同的服务器上,但 运行 在两个不同的本地进程中用于开发 - Windows 7 和 IIS 7.5。我正在尝试使用 Enterprise Library 6 Logging Application Block 在两个进程中实现滚动平面文件跟踪侦听器。我有一个包含我的 Log class 的公共项目,它将保留自己的单例实例 - 对 Logger 的所有访问都将是:
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 & Warnings">
<listeners>
<add name="Rolling Flat File Trace Listener" />
</listeners>
</errors>
</specialSources>
WebApi 堆栈正在使用 Unity 为所有控制器依赖项执行 DI。我的单例实例已得到正确解析并注入到我的所有控制器都派生自的 ApiController 基 class 上。我有一个操作过滤器,它试图在 onActionExecutingAsync 和 onActionExecutedAsync 事件中写入日志。
这是问题所在:WebApi 进程未将条目写入 WebApi.log 文件。该过程创建文件;它只是没有在那里写任何东西。我很确定我一开始就在那里写了一些东西,但我就是不能再在那里记录任何东西了。我已经通过调试器,IsLoggingEnabled() returns true,Logger.Write 方法被调用。我已经尝试撤消对前端日志记录块的所有引用,认为同一台机器上的多个进程中的块存在问题 运行。没变化。前端 MVC 进程正在创建并记录到 Web.log 文件(同样,相同的配置)。任何人对我所缺少的东西有任何线索吗?提前致谢。
日志应用程序块有一个 known issue,如果 ExtendedProperty 值为空,则条目 LogEntry 将失败并且不会被记录。
如果为任何 ExtendedProperty 值传入 null,请尝试更改您的代码以编写一个空字符串。例如:
entry.ExtendedProperties.Add("Method", method ?? String.Empty);
这应该可以避免遇到问题。
我正在实施一个多层 Web 解决方案,使用 ASP.NET Web 堆栈的 MVC 5 和后端服务堆栈的 WebApi 2.2。这些将在部署时位于不同的服务器上,但 运行 在两个不同的本地进程中用于开发 - Windows 7 和 IIS 7.5。我正在尝试使用 Enterprise Library 6 Logging Application Block 在两个进程中实现滚动平面文件跟踪侦听器。我有一个包含我的 Log class 的公共项目,它将保留自己的单例实例 - 对 Logger 的所有访问都将是:
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 & Warnings">
<listeners>
<add name="Rolling Flat File Trace Listener" />
</listeners>
</errors>
</specialSources>
WebApi 堆栈正在使用 Unity 为所有控制器依赖项执行 DI。我的单例实例已得到正确解析并注入到我的所有控制器都派生自的 ApiController 基 class 上。我有一个操作过滤器,它试图在 onActionExecutingAsync 和 onActionExecutedAsync 事件中写入日志。
这是问题所在:WebApi 进程未将条目写入 WebApi.log 文件。该过程创建文件;它只是没有在那里写任何东西。我很确定我一开始就在那里写了一些东西,但我就是不能再在那里记录任何东西了。我已经通过调试器,IsLoggingEnabled() returns true,Logger.Write 方法被调用。我已经尝试撤消对前端日志记录块的所有引用,认为同一台机器上的多个进程中的块存在问题 运行。没变化。前端 MVC 进程正在创建并记录到 Web.log 文件(同样,相同的配置)。任何人对我所缺少的东西有任何线索吗?提前致谢。
日志应用程序块有一个 known issue,如果 ExtendedProperty 值为空,则条目 LogEntry 将失败并且不会被记录。
如果为任何 ExtendedProperty 值传入 null,请尝试更改您的代码以编写一个空字符串。例如:
entry.ExtendedProperties.Add("Method", method ?? String.Empty);
这应该可以避免遇到问题。