0

我有一个使用 Enterprise Library 6.0 进行日志记录的 C# .NET 应用程序。我已经声明了一个用于数据库日志记录的跟踪侦听器和另一个用于平面文件日志记录的跟踪侦听器。并准备好处理相同的日志类别“General”。

在我的应用程序中,当我调用 LogWriter.Write("Test Log", "General"); 一切都很好,我在数据库和平面文件中也看到了“测试日志”。

但是如果其中一个失败了;例如,当我调用 LogWriter.Write("Test Log", "General"); 假设数据库不可访问。我期望 LogWriter 只是将数据写入平面文件。

不幸的是,我没有看到任何日志都写在平面文件和数据库中。平常吗?是否可以为连续记录配置记录机制?(例如,如果其中一个跟踪侦听器失败,则继续下一个跟踪侦听器)

这是我的日志记录配置

public static LoggingConfiguration BuildConfig()
{
    string baseFilePath = @"C:\LogDirectory";
    DatabaseProviderFactory factory = new DatabaseProviderFactory(new SystemConfigurationSource(false).GetSection);
    DatabaseFactory.SetDatabaseProviderFactory(factory, false);

    // Formatters
    TextFormatter briefFormatter = new TextFormatter("Timestamp: {timestamp(local)}{newline}Message: {message}{newline}Category: {category}{newline}Priority: {priority}{newline}EventId: {eventid}{newline}ActivityId: {property(ActivityId)}{newline}Severity: {severity}{newline}Title:{title}{newline}");
    TextFormatter extendedFormatter = new TextFormatter("Timestamp: {timestamp}{newline}Message: {message}{newline}Category: {category}{newline}Priority: {priority}{newline}EventId: {eventid}{newline}Severity: {severity}{newline}Title: {title}{newline}Activity ID: {property(ActivityId)}{newline}Machine: {localMachine}{newline}App Domain: {localAppDomain}{newline}ProcessId: {localProcessId}{newline}Process Name: {localProcessName}{newline}Thread Name: {threadName}{newline}Win32 ThreadId:{win32ThreadId}{newline}Extended Properties: {dictionary({key} - {value}{newline})}");

    var databaseTraceListener = new FormattedDatabaseTraceListener(DatabaseFactory.CreateDatabase("DefaultDB"), "WriteLog", "AddCategory", extendedFormatter);
    var flatFileTraceListener = new FlatFileTraceListener(baseFilePath + @"\FlatFile.log", "----------------------------------------", "----------------------------------------", briefFormatter);

    LoggingConfiguration config = new LoggingConfiguration();

    //Log Sources
    config.AddLogSource("General",SourceLevels.All,true);

    //Match Trace Listeners For Log Sources
    config.LogSources["General"].AddTraceListener(databaseTraceListener);
    config.LogSources["General"].AddTraceListener(flatFileTraceListener);

    return config;
}

这是我登录我的应用程序的地方:

public void DoSampleLogging()
{
    LogWriter defaultWriter;
    LoggingConfiguration loggingConfiguration;

    loggingConfiguration = LoggingHelper.BuildConfig();
    defaultWriter = new LogWriter(loggingConfiguration);

    defaultWriter.Write("Test Log", "General");
}
4

1 回答 1

2

不幸的是,这种行为似乎是设计使然。如果一个侦听器失败,则不会处理该类别的其他侦听器。请参阅此页面上的答案以供参考。

于 2013-12-17T23:45:29.847 回答