C# 关于使用静态类进行日志记录的建议

C# 关于使用静态类进行日志记录的建议,c#,C#,我目前面临一个与在WPF应用程序中记录消息相关的问题 我保留了一个静态类,用于在包含函数的整个应用程序中记录消息 private SomeService service = new SomeService(); private void LogMessage(string message) { service.Log(message); } 我的问题是在我需要记录日志的屏幕中,我在屏幕的不同位置附加字符串,并将其传递给LogMessage函数。我有非常大的数据要从屏幕内的不同位置记录

我目前面临一个与在WPF应用程序中记录消息相关的问题

我保留了一个静态类,用于在包含函数的整个应用程序中记录消息

private SomeService service = new SomeService();

private void LogMessage(string message)
{
   service.Log(message);
}
我的问题是在我需要记录日志的屏幕中,我在屏幕的不同位置附加字符串,并将其传递给LogMessage函数。我有非常大的数据要从屏幕内的不同位置记录

现在我面临的问题是,一个新成员已经被引入ie

public bool IsLoggingEnabled = false;
现在我需要在每次像这样附加字符串之前检查这个条件

if(ClassName.IsLoggingEnabled)
{
    var msg = string.Format("Log 1 : {0}, Log 2 : {1}, Log 3 : {2} .... ", 0,1,2);
}

if(ClassName.IsLoggingEnabled)
{
    msg += string.Format("Log 4 : {0}, Log 5 : {1}, Log 6 : {2} .... ", 4,5,6);
}

...............

ClassName.LogMessage(msg);
你能建议一个处理这种情况的解决方案吗? 附加所有消息并最终检查条件是否合适。或者检查LogMessage函数中的条件


但我觉得这些都是错误的方式。如果您有任何建议,我们将不胜感激。

您可以在登录类中检查此参数,并使其对您使用它的其他位置保持透明:

private void LogMessage(string message) 
{ 
    if(ClassName.IsLoggingEnabled)
    {
        service.Log(message); 
    }
}
关于字符串连接,为什么不把它写在单独的日志中——每个日志都在它自己的调用中。使代码更清晰,状态更少


最后,我认为更好的实现是让类依赖于
ILogger
实例并直接使用它。它将在某个地方初始化并传递给您的类。这将使您更容易更改日志类和测试其他类。

您可以在登录类中检查此参数,并使其对其他使用它的地方保持透明:

private void LogMessage(string message) 
{ 
    if(ClassName.IsLoggingEnabled)
    {
        service.Log(message); 
    }
}
关于字符串连接,为什么不把它写在单独的日志中——每个日志都在它自己的调用中。使代码更清晰,状态更少


最后,我认为更好的实现是让类依赖于
ILogger
实例并直接使用它。它将在某个地方初始化并传递给您的类。这将使您更容易更改日志类和测试其他类。

使用当前的实现,
IsLoggingEnabled
属性可以移动到静态
LogMessage
,并且在加载项目时或通过代码或外部配置文件时,该属性可以设置一次。

使用当前实现,
IsLoggingEnabled
属性可以移动到静态的
LogMessage
,并且可以在加载项目时或通过代码或从外部配置文件中设置该属性一次。

如果
IsLoggingEnabled
LogMessage
在同一类中定义,则只需将
If
放入
LogMessage
方法,并保持所有调用类的干净性-它们只需调用
LogMessage
。你正在发明轮子。日志框架可以分派日志消息。例如,您可以使用严重性级别和记录器配置来决定是否写入日志<代码>IsLoggingEnabled气味。此外,静态记录器也不是好的解决方案-当您决定从一个记录器移动到另一个记录器时(通常这只是时间问题),很难做到这一点。@Enigmativity:谢谢您的建议。但是,即使不需要日志记录,也会不必要地调用该函数。无论如何,这是可能的方法之一。@IDisposable:call
LogMesage
。让日志框架来决定,当它必须执行实际的日志记录时。@IDisposable-现在有两个人建议您只调用log函数并由它决定。如果
IsLoggingEnabled
LogMessage
定义在同一个类中,则只需将
If
放在
LogMessage
方法中,并保持所有调用类的干净-它们只需调用
LogMessage
。你正在发明轮子。日志框架可以分派日志消息。例如,您可以使用严重性级别和记录器配置来决定是否写入日志<代码>IsLoggingEnabled气味。此外,静态记录器也不是好的解决方案-当您决定从一个记录器移动到另一个记录器时(通常这只是时间问题),很难做到这一点。@Enigmativity:谢谢您的建议。但是,即使不需要日志记录,也会不必要地调用该函数。无论如何,这是可能的方法之一。@IDisposable:call
LogMesage
。让日志框架来决定什么时候必须执行实际的日志记录。@IDisposable-现在有两个人建议您只需调用log函数,让它来决定。谢谢您的建议。我会查的。谢谢你的建议。我会查的。谢谢你的建议。谢谢你的建议。