C# NLog:将记录器名称限制为枚举或其他结构

C# NLog:将记录器名称限制为枚举或其他结构,c#,logging,nlog,C#,Logging,Nlog,我正在使用NLog进行一些日志记录,感谢以下回答: 我能够将不同类型的事件(例如:“热”、“数据库”等)记录到一个文件中,logger字段显示事件类型。举个例子来说: NLog.LogManager.GetLogger("Database").Debug("Error writing to DB"); 这一切都很好,可能就足够了。但是,您会注意到,任何程序员都可以在GetLogger中随意输入他们想要的任何名称并拼写错误。“GetLogger(“Datobuse”)。如果程序员必须从枚举或其

我正在使用NLog进行一些日志记录,感谢以下回答:

我能够将不同类型的事件(例如:“热”、“数据库”等)记录到一个文件中,logger字段显示事件类型。举个例子来说:

NLog.LogManager.GetLogger("Database").Debug("Error writing to DB");
这一切都很好,可能就足够了。但是,您会注意到,任何程序员都可以在GetLogger中随意输入他们想要的任何名称并拼写错误。“GetLogger(“Datobuse”)。如果程序员必须从枚举或其他结构中进行选择,那就太好了:

NLog.LogManager.GetLogger(LoggerNames.Database).Debug("Error writing to DB");
这似乎是一个常见的问题,可能已经有了一个优雅的解决方案。我可以想象覆盖LogManager类,但不确定具体细节。请注意,LogManager是NLog库中的一个公共静态类,因此不清楚如何隐藏它。另外,如果您在在我们的应用程序项目中,只要将NLog作为参考,配置文件就可以完美地用于解决方案中的所有项目

我将继续创建一个利用NLog库的库项目,然后将其包括在我的主要项目中,除非已经有一个很好的解决方案。我打赌有,但还没有看到

谢谢

Dave

如果您有“全局”记录器名称,那么简单的解决方案就是使用全局记录器实例


同一个全局NLog Logger实例可以由多个位置使用,而不会出现线程问题。

只需使用接受枚举并调用真实版本的方法来实现您自己版本的LogManager。然后要求您的开发人员使用您的自定义管理器。至于禁止调用“真实日志管理器:是的,根据问题的性质,我确实有“全局”记录器名称,如“Thermal”或“StateMachine”。但我不知道你的意思。你能再多说一些细节吗?您的意思是在顶级项目中执行所有GetLogger调用一次并保存Logger对象吗?这将如何阻止另一个项目调用GetLogger(“StatChaning”)注意错误的logger名称。我的理解是,我可以在最顶层的项目中只有一个Nlog.config文件,但我需要在每个项目中添加对Nlog的引用。一旦每个人都有了对NLog的引用,他们就可以调用GetLogger(“AnyNameYouWant”),而不是拥有一个包含神奇枚举内容的共享项目。然后您就可以拥有一个包含神奇的全局记录器实例的共享项目。只有共享项目将调用GetLogger(“Thermal”),其他所有人都将从共享项目中获取记录器。无论如何,听起来你是在用大炮射击,以避免神奇的只读字符串值。小心不要花太多时间保护自己。是的,项目中的任何人都可以调用
GetLogger(“AnyNameYouWant”)
。如果您有一个包含许多模块的大型应用程序,那么您通常使用名称空间来避免名称冲突。如果您想要一个独立的NLog配置(而不是全局配置),那么您可以创建自己的本地LogFactory。另见