首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多个Grails应用程序+ tomcat-slf4j-logback,如何将应用程序名称输入日志文件

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

Stack Overflow用户
提问于 2015-07-01 22:09:54
回答 1查看 1.2K关注 0票数 2

我们目前正在将几个Grails (2.4.4)应用程序部署到Tomcat 7服务器上,并按照这里的tomcat-slf4j-logback描述配置了日志记录。

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

代码语言:javascript
复制
#Grails Metadata file
app.name=my-application

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

代码语言:javascript
复制
<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插件中,这些应用程序从application.properties文件中查找它。这将在日志文件中产生类似于以下内容的输出:

代码语言:javascript
复制
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’。

我在logback.xml中尝试了以下几种方法

代码语言:javascript
复制
<property resource="application.properties" />

它应该从类路径加载application.properties,但给出:

代码语言:javascript
复制
  13:34:18.796 [app.name_IS_UNDEFINED] DEBUG a.b.c.MyClass : hello

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

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

代码语言:javascript
复制
// 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"]
}

}

这是可行的,只要我将“logback.configurationFile”设置为指向它,但我不认为用logback.groovy替换单一的logback.xml -- Tomcat 7服务器是可行的(但这是我的下一个尝试)

其他我试过的事情

  • 使用Bootstrap.groovy访问logback上下文并将'app.name‘放入上下文中
  • 使用Bootstrap.groovy实现MDC.put('app.name‘、“application-1”)
  • 我读过关于ContextSelectors http://logback.qos.ch/manual/contextSelector.html的文章,JNDI contextSelector很有趣,但我不想重复配置,只需在每个应用程序中添加一个属性,我就可以使用appender模式访问

如能提供任何帮助,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-21 05:35:31

配置步骤:

  1. 在grails-app/conf/application.yml或外部应用程序配置文件中添加下面一行:log: config:"C:/ application /config/logback.groovy“文件:"app.log”路径:“C:/Application/log”
  2. 将配置文件放在上面提供的配置路径中(在上面的C:/Application/ config /logback.groovy中):

前:

代码语言:javascript
复制
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"])  

通过执行第一步,所有应用程序都可以指向同一个配置文件。因此,所有日志都将根据步骤1中指定的路径和文件生成。

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

代码语言:javascript
复制
•   ${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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31172544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档