1

好的,所以我遇到了我想以对我们的开发团队影响最小的方式解决的情况。

我们在一个较大的 c# 系统(约 40 个生产程序集)中使用 log4net 作为我们的日志框架。

现在我们的支持端希望能够将记录的事件与他们单独维护的数据库相关联。一个合理的要求。

在生产中,我们的主要日志存储库是 Windows 事件日志。


在开发人员方面,我们当前的模式是这样的:

每当你想从一个组件中记录时,你可以在类的顶部实例化一个这样的记录器:

private static readonly ILogger Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod())

如果您需要日志上下文中的内容,则尽可能早地将其放入每个线程的流程中,即。在服务呼叫的接收端等。

每当您想进行日志记录时,您只需执行 Log.Warn(str, ex) - (或 Info, Error 等)


现在我们想将这个日志条目“修复”为一个唯一的“eventId”,我们可以为 ILogger 提供一个扩展方法,这将允许我们这样做: Log.Warn(int, str, ex), when "int"是具有以下属性的数字:

  • 它被“映射”到持久存储。
  • 它指向一个且只有一个 Log 条目
  • 如果源代码 Log 语句被删除,则 Id 不会被重新用于新的 log 语句。

我的直接解决方案是维护一个全局枚举,它将涵盖一组可能的“eventId”,并指示开发人员“只使用一次”。

然后,我们将继续在我们的命名空间和“CategoryId”之间进行某种“智能”映射——“BusinessLayer”命名空间中的 f.ex 任何东西都会分配一个 categoryId。

但我认为我缺少一些东西......

任何想法将不胜感激:

  • 您如何在大型系统中使用 EventId 和 CategoryId?(或“什么”你用它们)
  • 你们中的任何人都有创建 EventId 的“动态”方式的示例,这样您就可以维护简单的日志记录方法,不需要开发人员在代码语句级别提供唯一的 Id。

抱歉,如果我的问题太宽泛,我知道我在这里有点钓鱼。

4

0 回答 0