【问题标题】:log4net logging from web app来自 Web 应用程序的 log4net 日志记录
【发布时间】:2010-12-28 20:12:04
【问题描述】:

我有一个框架库,它可以做很多事情,包括日志记录。我们正在使用 log4net 进行日志记录。该框架具有静态日志类 LogManager、ILog 的静态实例(logger)和用于记录 INFO、WARNING、DEBUG 等的静态方法。

静态实例记录器正在像这样初始化:

public static class LogManager
{        
    private static ILog Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

    static ActivityLogManager()
    {

    }

    public static void LogDebugy(string message, params object[] messageParameters)
    {
        // Log the message here
    }
}

我自己怀疑这是否是正确的做法。我从here 看到,每个需要记录的类都应该声明一个ILog 的静态实例。

我还看到我必须在我的框架项目中指定 Log4net 配置文件来记录。以为我读到 here 会从正在执行的程序集中获取配置,但我没有看到它发生。

有什么方法可以让我从我的框架类完成日志记录,并从我的 Web 应用程序(对于我的 Web 应用程序)或其他一些业务库项目(对于我的业务类库)获取配置?

我还想在我的日志中添加一些自定义信息(如自定义业务对象 ID 等、应用程序池、ServerName、ClientHostName、ClientBrowser、ClientOS、Client User 等)。有可能吗?

我正在使用 AdoNetAppender。

Edit1:我在 assembly.cs 中使用 log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = true) 指向 log4net 配置文件。

Edit2:我的ILog Logger 在我的框架LogManager 类中,因此我的应用程序只生成了一个实例。

【问题讨论】:

  • 通常每个需要记录某些内容的类都有自己的 ILog 实例,最好使用表明某种层次结构的名称(名称空间 + 类型很常见。)这允许过滤消息。 NHibernate 这样做允许您过滤掉来自某些子库的消息并转储所有 SQL 查询(通常记录在 DEBUG 中)。

标签: logging log4net


【解决方案1】:

很多问题,但关于第一个问题,我使用这种风格的记录器:

private static ILog Log = LogManager.GetLogger(typeof(MyClass));

当然,您可以随意命名变量,但我认为这是 log4net 团队推荐的,因为这会导致每个类实例只有一个 ILog-instance。

这或多或少是您已经在做的事情,因此无需担心。我不确定你为什么要通过执行方法走很长的路。

我通常将配置放在 Web.config 或 App.config 中。我无法推断您是否将其中任何一个用于配置。如果您确实使用它们,这很简单。您只需为 log4net 添加一个configuration 部分并添加您需要的记录器、附加程序和过滤器。

如果您想记录自定义数据,您可以将其添加到日志消息中,例如:

Log.WarnFormat(
    "Reactor malfunction, temperature {0} celsius."
    + "Evacuate sector {1} immediately", 
    temp, 
    sector);

或者如果需要的值存储在某个对象中,您可以为该类型创建一个“渲染器”,当对象作为日志消息传递时,它将自定义打印,例如Log.Warn(myObjWithCustomFormatting)

对象渲染器必须从IObjectRenderer 派生并在配置中注册。

【讨论】:

  • 我使用上述方法,但使用 System.Reflection.Methodbase.GetCurrentMethod().DeclaringType() 自动获取类的类型。因为这仅在构造函数被调用时才会发生。
  • 我明白你的意思。我猜这是一个偏好问题。
  • 感谢 Skurmedal:我没有使用 web.config 或 app.config,我使用的是 assembly.cs(请参阅我的编辑)。另外,当我的意思是我想记录自定义对象时,我不是在谈论格式。我看到使用 InfoFormat 或 WarnFormat 将其记录到我的 DB 列 -message 中。我想在数据库中创建一个自定义列并存储一些自定义信息
  • 哦,好吧,我想你可能需要创建自己的 Appender。
【解决方案2】:

我们在许多 web 应用程序中使用 log4net,它们都很好。如果您想从 web 应用程序登录到事件日志,则需要进行一些特殊设置,这取决于您使用的 Windows 版本。简而言之,它要求您授予正在运行的用户写入事件日志的权限。在 Win 7、2008 等下,您必须授予整个分支权限,其他所有权限都只是特定的应用程序日志。

如果您想登录到文件,只需确保该文件位于应用程序目录中就可以了。

如果您没有在日志框架中声明日志记录的配置,而是将其延迟到您的应用调用它,默认情况下会在 log4net 配置部分发生这种情况。如果它早于加载,则将使用第一个加载的版本,除非您在代码中覆盖它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多