当前位置: 首页 > 知识库问答 >
问题:

由于Log4j中的默认行为,避免对同一消息进行多次日志记录

陆和泰
2023-03-14

我在Grails应用程序中工作,希望在不同的文件中记录消息。我想在不同的文件中记录异常,正常和API日志。但是根据Log4j的一般角色,如果我们将记录器级别设置为'info',那么警告和错误消息也将开始登录到这个文件中,而我想在不同的文件中记录错误消息。因此,我的错误信息将被记录在错误文件和信息文件中。虽然我希望“信息”记录器只记录“信息”级别的消息,而不是“错误”级别的消息。而“错误”记录器只记录错误消息。

log4j = {
def layoutPattern = new PatternLayout("[%d{ISO8601}] %m \r\n")
def dailyRollingInfoFile = new DailyRollingFileAppender(
        name:"rollingInfoFileAppender",
        layout: layoutPattern,
        //Path of the Log File
        fileName:"C:\\MS-Logs\\Application\\MSLogs.log",
        datePattern: "'.'dd-MM-yyyy")

def dailyRollingExceptionFile = new DailyRollingFileAppender(
        name:"rollingExceptionFileAppender",
        layout: layoutPattern,
        //Path of the Log File
        fileName:"C:\\MS-Logs\\Exceptions\\ExceptionLogs.log",
        datePattern: "'.'dd-MM-yyyy")

def dailyRollingExceptionAPIFile = new DailyRollingFileAppender(
        name:"rollingAPIFileAppender",
        layout: layoutPattern,
        //Path of the Log File
        fileName:"C:\\MS-Logs\\API\\MS-NotificationsLogs.log",
        datePattern: "'.'dd-MM-yyyy")

 //For logging exceptions stack trace
appenders {
    appender dailyRollingInfoFile
    appender dailyRollingExceptionFile
    appender dailyRollingExceptionAPIFile
   }

root {
    info  'rollingInfoFileAppender', additivity: false
    debug 'rollingAPIFileAppender', additivity: false
    error 'rollingExceptionFileAppender'
}
}
dailyRollingExceptionFile.addFilter(new org.apache.log4j.varia.LevelMatchFilter(levelToMatch:'ERROR', acceptOnMatch: true))
dailyRollingExceptionFile.addFilter(new org.apache.log4j.varia.DenyAllFilter())

//To make it sure that It will just Log, Messages by Info Logger
dailyRollingInfoFile.addFilter(new org.apache.log4j.varia.LevelMatchFilter(levelToMatch:'INFO', acceptOnMatch: true))
dailyRollingInfoFile.addFilter(new org.apache.log4j.varia.DenyAllFilter())

//To make it sure that It will just Log, Messages by API Logger
dailyRollingAPIFile.addFilter(new org.apache.log4j.varia.LevelMatchFilter(levelToMatch:'DEBUG', acceptOnMatch: true))
dailyRollingAPIFile.addFilter(new org.apache.log4j.varia.DenyAllFilter())

如何避免在不同的文件中重复记录相同的消息?我们如何在不同的文件中记录消息而不在其他文件中重复它?

感谢您抽出时间:)

共有1个答案

赫连棋
2023-03-14

我相信log4j的levelmatchfilter允许您做您想做的事情:

def dailyRollingInfoFile = new DailyRollingFileAppender(...)
dailyRollingInfoFile.addFilter(new org.apache.log4j.varia.LevelMatchFilter(levelToMatch:'INFO', acceptOnMatch: true))
dailyRollingInfoFile.addFilter(new org.apache.log4j.varia.DenyAllFilter())

denyallfilter删除levelmatchfilter不匹配的消息(即除级别信息以外的所有内容)

 类似资料:
  • 问题内容: 我的网站流量很高,并且使用hibernate模式。我还使用ehcache缓存生成页面所需的一些实体和查询。 问题是“并行高速缓存未命中”,长原因是当应用程序启动且高速缓存区域变冷时,每个高速缓存区域将由不同线程填充多次(而不是仅一次),因为该站点受到许多用户的攻击与此同时。另外,由于相同的原因,当某些缓存区域无效时,它会被多次填充。如何避免这种情况? 我通过向hibernate.cac

  • 问题内容: 我正在开发一个Angular应用程序。在此,我将在进入仪表板之前对用户进行身份验证。为了达到这个目的,我写了as 登录功能 我还想限制用户访问路由(如果尚未登录)。为此,我想到了this 。 路线 我说上面的代码 DIRTY 的原因是,如果我要保护10条未授权用户使用的路由,则必须在所有路由中复制相同的resolve函数。 所以我的问题是,我应该怎么做才能摆脱多重解析功能并能够编写DR

  • 问题内容: 我正在使用的Web应用程序偶尔会为某些用户带来数据完整性问题。我想打开跟踪级别的日志记录,但是由于我们每秒要处理100个请求,因此每个日志记录都是不可能的。 log4j是否可以有条件地记录日志?换句话说,我希望仅在特定用户发出请求时才能获得跟踪日志。由于我事先不知道哪些用户会受到影响,因此我无法简单地临时对用户名进行硬编码。 编辑: 我想我需要更清楚一点。我可以轻松地在日志语句中添加条

  • 问题内容: 我已经将一个Web应用程序部署到服务器上。我的应用程序使用和。但是,并非所有日志记录消息都已写入文件。 在我的课堂上,我有: 我的文件在本地计算机上运行良好,并且已正确部署。 我看到正在写入的应用程序生成的错误消息没有写入我的。由于输出模式的格式与我的模式不同,因此看起来的日志消息来自其他日志框架。我在中看到的日志记录如下: 我的log4j模式是这样的: 一些日志记录出现在我的文件日志

  • 问题内容: 我正在使用Python日志记录,由于某种原因,我的所有消息都出现两次。 我有一个配置日志记录的模块: 稍后,我调用此方法来配置日志记录: 然后,在buy_ham模块中,我将调用: 由于某种原因,所有消息都出现两次。我注释掉其中一个流处理程序,还是一样。有点奇怪,不确定为什么会这样…大声笑。假设我错过了一些显而易见的事情。 干杯,维克多 问题答案: 您正在调用两次(也许使用的方法):将返

  • 我有一个场景,一个特定的日志消息可能会被打印很多次(可能是数百万次)。例如,如果我们记录(使用方法)每个缺少字段的记录,那么我们可能会记录很多--在输入文件有很多缺少字段的记录的情况下(例如,HDFS上的大文件)。这会很快填满磁盘空间。 为了避免这种情况,我正在尝试为每1000个缺少字段的记录(例如)记录一次。我可以在log4j包之外实现所有这些逻辑,但我想知道是否有更干净的方法来实现这些。理想情