質問

I have a C# .NET application using Enterprise Library 6.0 for logging. I have declared one trace listener for database logging and another trace listener for flat file logging. And prepared them for handling same log category "General".

In my application when i call LogWriter.Write("Test Log", "General"); everything is fine i see the "Test Log" in database and flat file as well.

But if one of them fails; For example when i call LogWriter.Write("Test Log", "General"); assume that the database is inaccessible. I expect from LogWriter just write the data into flat file.

Unfortunately i don't see any log written both in flat file and database. Is it usual? And is it possible to configure logging mechanism for consecutive logging? ( like if one of trace listeners fails continue with next trace listener)

Here is my logging configuration

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;
}

Here is where I do logging in my app:

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

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

    defaultWriter.Write("Test Log", "General");
}
役に立ちましたか?

解決

Unfortunately, this behavior appears to be by design. If one listener fails the others for that category are not processed. See the answer on this page for reference.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top