【发布时间】:2021-02-12 10:00:23
【问题描述】:
我想知道为什么像 NLog 这样的 Logger 有一个静态实现?
据我了解,使用“静态”通常是不好的做法,因为它会阻止多线程。
我知道我们想要阻止多个方法同时访问同一个记录器,但是这样做,我们不是也阻止了不同的记录器并行运行吗?
有什么我没有得到的吗?
这是一个强调问题的代码示例:
public static class LogUtils
{
...
public static void SetupLogging(string appName, string logFileName)
{
var target = (FileTarget)LogManager.Configuration.FindTargetByName("f");
_logFileName = string.IsNullOrEmpty(logFileName) ? GetFileName(appName): logFileName;
target.FileName = _logFileName;
LogManager.ReconfigExistingLoggers();
}
}
【问题讨论】:
-
静态不会阻止多线程。修改共享状态可以 =)
-
不,
static不会阻止多个线程同时启动。lock确实如此。 -
我所知道的所有日志框架都是线程安全的:如果不是,那将是一个糟糕的日志框架!他们在内部处理这个问题的方式各不相同(有时是可配置的),但您可以确信您可以使用静态 LogManager 来获取两个记录器并同时从两个线程中使用它们
-
通常,您希望所有日志记录都转到单个日志输出,因此这是默认设置。但是你可以在 NLog 中使用多个记录器:你需要在配置文件中指定多个记录器,然后使用
LogManager.GetLogger()来获取它们。所以虽然LogManager.GetLogger()是静态的,但它返回的记录器显然不是静态类。 -
@00110001 将 DI 与记录器一起使用不一定是一个好主意,因为它涉及跨领域问题。尽管如此,完全可以将 DI 与 NLog 一起使用。
标签: c# multithreading logging