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

多个Grails应用程序+tomcat-slf4j-logback,如何将应用程序名写入日志文件

苏胤
2023-03-14

我们目前正在将几个Grails(2.4.4)应用程序部署到一个Tomcat7服务器上,并且已经完全按照这里所描述的tomcat-SLF4j-logback配置了日志记录。

我们希望通过一个logback.xml文件配置所有grails应用程序,并将所有应用程序记录到一个文件中,但按照grails的application.properties中定义的应用程序名称区分日志消息:

#Grails Metadata file
app.name=my-application

我们的logback.xml附加器当前如下所示:

<appender name="FILE" 
         class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${catalina.base}/logs/all.log</file>
    <append>true</append>
    <encoder>
        <charset>utf-8</charset>
        <pattern>%d [%X{appname:-null}] %-5level %logger : %msg%n</pattern>
    </encoder>
    ...
</appender>

正如您所看到的,我们当前正在从MDC(映射的诊断上下文)中提取'appName'。它由Grails插件中的Grails过滤器放置在那里,所有应用程序都共享Grails插件,这些应用程序从application.properties文件中查找它。这将在日志文件中生成类似以下内容的输出:

13:34:18.796 [application-1] DEBUG a.b.c.MyClass : hello
13:34:18.797 [application-2] DEBUG a.b.c.MyClass : hello
13:34:18.798 [null] DEBUG b.c.d.OtherClass : No App Name
13:34:18.798 [application-3] DEBUG a.b.c.MyClass : hello
13:34:18.799 [null] DEBUG b.c.d.OtherClass : No App Name

由于MDC的threadLocal特性,因此缺少此解决方案。那些在请求/响应线程之外执行的类不能访问相同的MDC以获取'appname'并打印'[null]'。

<property resource="application.properties" />
  13:34:18.796 [app.name_IS_UNDEFINED] DEBUG a.b.c.MyClass : hello

我认为这意味着logback找不到application.properties文件(它们在每个wars中都打包在WEB-INF\classes\中)...

我还尝试在本地使用logback.groovy ala:

// logback.groovy
// Read in the Grails application.properties
def props = new Properties()
new File("application.properties").withInputStream { 
    stream -> props.load(stream) 
}

def slurper = new ConfigSlurper().parse(props)

// Get the application name.
String grailsAppName = slurper.app.name

appender("CONSOLE", ConsoleAppender) {
encoder(PatternLayoutEncoder) {
  pattern = "%d [${grailsAppName ?: 'Application Name Not Set'}]  %-5level %logger - %msg%n"]
}

}

    null

共有1个答案

柴茂材
2023-03-14

配置步骤:

>

  • 在grails-app/conf/application.yml或外部应用程序配置文件中添加下面一行:

     logging:
     config: "C:/Application/config/logback.groovy"  
     file: "app.log"  
     path: "C:/Application/logs"  
    

    将配置文件放入上面提供的配置路径中(如:/application/config/logback.groovy):

    import grails.util.BuildSettings  
    import grails.util.Environment  
    
    import ch.qos.logback.classic.encoder.PatternLayoutEncoder  
    import ch.qos.logback.core.ConsoleAppender  
    import ch.qos.logback.core.FileAppender  
    
    import static ch.qos.logback.classic.Level.DEBUG  
    
    def targetDir = System.getProperty("LOG_PATH")  
    def targetFile = System.getProperty("LOG_FILE")  
    
    appender("FILE", FileAppender) {  
    file = "${targetDir}/${targetFile}"  
    encoder(PatternLayoutEncoder) {  
    pattern = "%date %level %logger - %msg%n"  
    }  
    }
    appender("STDOUT", ConsoleAppender) {  
    encoder(PatternLayoutEncoder) {  
    pattern = "%msg%n"  
    }  
    }  
    root(INFO, ["FILE", "STDOUT"])  
    

    日志记录系统负责为您创建的系统属性:

    •   ${PID} the current process ID.  
    •   ${LOG_FILE} if logging.file was set in Boot’s external configuration.  
    •   ${LOG_PATH} if logging.path was set (representing a directory for log files   to live in).  
    •   ${LOG_EXCEPTION_CONVERSION_WORD} if logging.exception-conversion-word was   set in Boot’s external configuration.  
    

    因此您可以在logback.groovy文件中使用它们,如上面所示的system.getProperty(“log_path”)。
    引用:
    https://docs.spring.io/spring-boot/docs/current/reference/html/howto-logging.html

  •  类似资料:
    • 是否有写入此事件日志的方法: 或者至少是其他一些Windows默认日志,在那里我不必注册事件源?

    • 我决定使用slf4j而不是Java自己的日志记录。我已经成功地使用SLF4J登录到控制台。但我不知道如何将其写入日志文件。日志文件将帮助我们收集运行时可能出现的错误。 我通过这样做来实现slf4j, 私有静态最终org.slf4j.LOGGER LOGGER=org.slf4j.loggerfactory.getlogger(class1.class); PropertyConfigurator.

    • 问题内容: 我必须在应用程序中添加一个面板,该面板将记录该应用程序的错误。我创建了一个扩展AppenderBase的类,并配置了xml文件以使用此类。 因此,当我在应用程序中登录时,会调用他的appender。 但是目前我还不知道如何将我的appender链接到面板。 你能指导我吗? 问题答案: 为此,您必须编写自定义,有关此信息,请参见:logback.qos.ch/manual/appende

    • 我想部署两个应用程序foo。war和条形图。war到同一个Tomcat实例。他们是否可以侦听不同端口上的连接,例如,foo侦听端口81,bar侦听端口82?如果是,我如何配置?我意识到应用程序没有必要监听不同的端口,但这正是我想要实现的。 此外,如果我将重命名为,使其在根上下文中运行,那么对该Tomcat实例的所有请求都将由foo应用程序处理,因此bar必须部署到单独的Tomcat实例,这是否正确

    • 我使用NetBeans7.3在Tomcat上部署WebApplication。当我运行/部署应用程序时,我可以在输出窗口中看到服务器日志和“Apache Tomcat日志”。 但是在我的应用程序中,我用log4j指定了另一个日志文件,仅用于我的应用程序日志。 我怎样才能像直接在NetBeans中看到其他日志输出一样看到我的应用程序的日志呢? 我的log4j有一个附加日志的规范--所以我的类的所有警

    • 我正在尝试获取一个应用程序的APK,并将其保存在存储目录的文件夹中。我已经得到了apk,但我无法将它保存到我想要的文件夹中。 下面是我如何生成apk文件: fileToSave是APK文件,但写它时没有这样的文件或目录。 java.io.FileNotFoundException:..../MyCreatedFolder/base.apk:open失败:ENOENT(没有这样的文件或目录) 所有所