tomcatログをjsonに記録

7896 ワード

この文書のTomcatバージョンは8.0.36です.
まず、開発したビジネスログは、開発をjson形式にするか、Logstashを使用して解析するかで、印刷されたログを開発する基準が異なるため、汎用的な製品が完成することはできないことを明らかにします.ここで変更したのはtomcat自体のログフォーマットだけです.
tomcat自身のログは次のとおりです.
catalina.2018-01-05.log
host-manager.2018-01-05.log
localhost.2018-01-05.log
manager.2018-01-05.log
localhost_access_log.2018-01-05.log

catalina.outにはtomcat自体と印刷を開発するアプリケーションログが含まれており、議論はしない.
Tomcatログのアクセスログはserver.xmlではjson形式で構成するのも便利ですが、他のログではjson形式で構成するのは不便です.これらのログについてtomcatは、デフォルトのjava.util.logginglog4jの2つのレコードを提供します.デフォルトの方法はjsonとして記録できません(少なくとも私は方法を見つけていません)、log 4 jを通じて、Logstashがプラグインを提供しているためです.
まずtomcatログの記録をlog 4 jに変更し、修正する方法をここにします.これは公式ドキュメントの翻訳で、公式ドキュメントを直接見ることもできます.
次の点に注意してください.
  • log 4 jのjarパッケージは必ず1.2である.Xバージョンのものは、最新版をダウンロードしないでください.
  • 例のlog4j.propertiesで指定するログファイルは、catalinaではなくcatalinaである.out.

  • すべてのjarパッケージはhttps://mvnrepository.com/ここでダウンロードします.
    公式に与えられたlog 4 jを変更しなければ.propertiesのログ記録フォーマットでは、構成に成功するとtomcat/logs/catalinaの出力と前のcatalina.out同じです.次はLogstashが提供するプラグインを使いますが、これはどう使いますか?簡単です.まず、上に示すmaven倉庫にjarパッケージ(1.6版が望ましい)をダウンロードし、tomcat/libディレクトリの下に入れ、log 4 jを変更します.properties:
    log4j.rootCategory=WARN, RollingLog
    log4j.appender.RollingLog=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.RollingLog.Threshold=TRACE
    log4j.appender.RollingLog.File=api.log
    log4j.appender.RollingLog.DatePattern=.yyyy-MM-dd
    log4j.appender.RollingLog.layout=net.logstash.log4j.JSONEventLayoutV1
    

    直接効果を得るために、ログ・レベルをINFOに変更できます.このときそのまま使うと、次のようなエラーが発生します.
    Using CATALINA_BASE:   /tmp/tomcat
    Using CATALINA_HOME:   /tmp/tomcat
    Using CATALINA_TMPDIR: /tmp/tomcat/temp
    Using JRE_HOME:        /usr/local/jdk1.7.0_79
    Using CLASSPATH:       /tmp/tomcat/bin/bootstrap.jar:/tmp/tomcat/bin/tomcat-juli.jar
    log4j:WARN Error during default initialization
    java.lang.NoClassDefFoundError: org/apache/commons/lang/time/FastDateFormat
        at net.logstash.log4j.JSONEventLayoutV0.(JSONEventLayoutV0.java:36)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at java.lang.Class.newInstance(Class.java:379)
        at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:336)
        at org.apache.log4j.helpers.OptionConverter.instantiateByKey(OptionConverter.java:123)
        at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:764)
        at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:735)
        at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:615)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:502)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:547)
        at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483)
        at org.apache.log4j.LogManager.(LogManager.java:127)
        at org.apache.log4j.Logger.getLogger(Logger.java:104)
        at org.apache.juli.logging.impl.Log4JLogger.getLogger(Log4JLogger.java:262)
        at org.apache.juli.logging.impl.Log4JLogger.(Log4JLogger.java:108)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at org.apache.juli.logging.impl.LogFactoryImpl.createLogFromClass(LogFactoryImpl.java:1025)
        at org.apache.juli.logging.impl.LogFactoryImpl.discoverLogImplementation(LogFactoryImpl.java:844)
        at org.apache.juli.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:541)
        at org.apache.juli.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:292)
        at org.apache.juli.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:269)
        at org.apache.juli.logging.LogFactory.getLog(LogFactory.java:657)
        at org.apache.catalina.startup.Catalina.(Catalina.java:820)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at java.lang.Class.newInstance(Class.java:379)
        at org.apache.catalina.startup.Bootstrap.init(Bootstrap.java:268)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang.time.FastDateFormat
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
        ... 36 more
    

    tomcat/libディレクトリの下に次のパッケージをダウンロードする必要があります.
    commons-lang-2.4
    json-smart-1.1.1
    junit-4.8.1
    

    そしてapiでロゴに効果が表示されます.
    {"@fields":{"level":"INFO","threadName":"localhost-startStop-1","mdc":{},"file":"HostConfig.java","class":"org.apache.catalina.startup.HostConfig","line_number":"1143","method":"deployDirectory","loggerName":"org.apache.catalina.startup.HostConfig"},"@timestamp":"2018-01-05T01:36:38.263Z","@message":"Deployment of web application directory \/tmp\/tomcat\/webapps\/manager has finished in 64 ms","@source_host":"SUC-IAS-JOB-02.UAT"}
    {"@fields":{"level":"INFO","threadName":"main","mdc":{},"file":"AbstractProtocol.java","class":"org.apache.coyote.AbstractProtocol","line_number":"471","method":"start","loggerName":"org.apache.coyote.http11.Http11NioProtocol"},"@timestamp":"2018-01-05T01:36:38.265Z","@message":"Starting ProtocolHandler [\"http-nio-9021\"]","@source_host":"SUC-IAS-JOB-02.UAT"}
    {"@fields":{"level":"INFO","threadName":"main","mdc":{},"file":"AbstractProtocol.java","class":"org.apache.coyote.AbstractProtocol","line_number":"471","method":"start","loggerName":"org.apache.coyote.ajp.AjpNioProtocol"},"@timestamp":"2018-01-05T01:36:38.270Z","@message":"Starting ProtocolHandler [\"ajp-nio-8009\"]","@source_host":"SUC-IAS-JOB-02.UAT"}
    {"@fields":{"level":"INFO","threadName":"main","mdc":{},"file":"Catalina.java","class":"org.apache.catalina.startup.Catalina","line_number":"642","method":"start","loggerName":"org.apache.catalina.startup.Catalina"},"@timestamp":"2018-01-05T01:36:38.272Z","@message":"Server startup in 695 ms","@source_host":"SUC-IAS-JOB-02.UAT"}