相关文章推荐
紧张的烤面包  ·  编译器错误 C3861 | ...·  2 月前    · 
玩篮球的灯泡  ·  EasyUi ...·  5 月前    · 

Log4j 是一个使用 Java 语言编写的,可靠、快速、灵活的日志框架(API),使用 Apache Software License 授权。它被移植到 C、C++、C#、Perl、Python、Ruby 和 Eiffel 语言中。

Log4j 是高度可配置的,在运行期使用外部的配置文件对其进行配置。它按照优先级别记录日志,并可将日志信息定向输出到各种介质,比如数据库、文件、控制台、Unix Syslog等。

Log4j 主要由三部分组成:

  • loggers:负责采集日志信息。
  • appenders:负责将日志信息发布到不同地方。
  • layouts:负责以各种风格格式化日志信息。
  • 二、新建Java工程

    下面通过实际的工程配置学习如何配置log4j。
    打开Eclipse或者Intellij Idea,新建一个maven工程。工程目录结构如下图所示:
    这里写图片描述
    pom.xml文件中加入log4j的依赖,版本为 1.2.17 ,pom.xml中的代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.logs</groupId>
        <artifactId>log4idemo1</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependencies>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
        </dependencies>
    </project>

    在resource目录下新建log4j.properties,加入以下配置:

    ### 设置###
    log4j.rootLogger = debug,stdout,D,E,logstash
    ### 输出信息到控制抬 ###
    log4j.appender.stdout = org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.Target = System.out
    log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
    ### 输出DEBUG 级别以上的日志到=/Users/bee/Documents/elk/log4j/debug.log###
    log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.D.File = /Users/bee/Documents/elk/log4j/debug.log
    log4j.appender.D.Append = true
    log4j.appender.D.Threshold = DEBUG 
    log4j.appender.D.layout = org.apache.log4j.PatternLayout
    log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    ### 输出ERROR 级别以上的日志到=/Users/bee/Documents/elk/log4j/error.log  ###
    log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.E.File =/Users/bee/Documents/elk/log4j/error.log 
    log4j.appender.E.Append = true
    log4j.appender.E.Threshold = ERROR 
    log4j.appender.E.layout = org.apache.log4j.PatternLayout
    log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
    #输出日志到logstash
    log4j.appender.logstash=org.apache.log4j.net.SocketAppender
    log4j.appender.logstash.RemoteHost=127.0.0.1
    log4j.appender.logstash.port=4560
    log4j.appender.logstash.ReconnectionDelay=60000
    log4j.appender.logstash.LocationInfo=true

    配置文件中,把日志输出了四份:

  • 第一份输出到控制台
  • 第二份把DEBUG 级别以上的日志到文件
  • 第三份把输出ERROR 级别以上的日志到文件
  • 第四份输出到logstash
  • 在java目录下添加Log4jTest.java,内容如下:

    import org.apache.log4j.Logger;
     * Created by bee on 17/3/6.
    public class Log4jTest {
        public static final Logger logger=Logger.getLogger(Log4jTest.class);
        public static void main(String[] args) {
            logger.debug("This is a debug message!");
            logger.info("This is info message!");
            logger.warn("This is a warn message!");
            logger.error("This is error message!");
            try{
               System.out.println(5/0);
            }catch(Exception e){
                logger.error(e);
    

    三、配置logstash

    (logstash的安装和hello world教程请点这里http://blog.csdn.net/napoay/article/details/53276758)这里使用logstash2.3.3和Elasticsearch 2.3.3,首先启动Elasticsearch,然后在logstash-2.3.3/conf目录下新建配置文件log4j-es.conf,文件内容如下:

    input {
        log4j {
            host => "127.0.0.1"
            port => 4560
    output {
        stdout {
          codec => rubydebug
        elasticsearch{
            hosts => ["localhost:9200"]
            index => "log4j-%{+YYYY.MM.dd}"
            document_type => "log4j_type"
    

    配置文件中指定日志输出有2份,一份输出到console,一份输出到Elasticsearch。
    启动logstash:

    sudo ./bin/logstash -f conf/log4j-es.conf

    如果你已经启动了Elasticsearch,IP和端口都是通畅的,配置文件无误,启动成功后的界面如下:
    这里写图片描述

    运行Log4jTest.java,在终端中可以看到以下输出:

    在Elasticsearch中查看导入的日志:
    这里写图片描述

    上述配置完成了日志的产生,到logstash,再到Elasticsearch,介绍完毕。

    ELK技术栈 - logstash学习笔记(八)
    运行 logstash 进程,然后另一个终端启动 redis-cli 命令。输入订阅指定频道的 Redis 命令 ("SUBSCRIBE logstash-chan-2014.08.08") 后,首先会看到一个订阅成功的返回信息。
    ELK技术栈 - logstash学习笔记(七)
    其次是 codec 设置。codec 的作用在之前已经讲过。可能除了 codecs/multiline ,其他 codec 插件本身并没有太多的设置项。所以一般省略掉后面的配置区段。换句话说。
    ELK技术栈 - logstash学习笔记(六)
    GeoIP 是最常见的免费 IP 地址归类查询库,同时也有收费版可以采购。GeoIP 库可以根据 IP 地址提供对应的地域信息,包括国别,省市,经纬度等,对于可视化地图和区域统计非常有用。
    ELK技术栈 - logstash学习笔记(五)
    这在导入旧数据的时候固然非常有用,而在实时数据处理的时候同样有效,因为一般情况下数据流程中我们都会有缓冲区,导致最终的实际处理时间跟事件产生时间略有偏差。
    ELK技术栈 - logstash学习笔记(四)
    在此之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。但现在,我们可以在输入 期处理不同类型的数据,这全是因为有了 codec 设置。
    ELK技术栈 - logstash学习笔记(三)
    syslog 可能是运维领域最流行的数据传输协议了。当你想从设备上收集系统日志的时候,syslog 应该会是你的第一选择。尤其是网络设备,比如思科 —— syslog 几乎是唯一可行的办法。
    ELK技术栈 - logstash学习笔记(二)
    Logstash使用一个名叫FileWatch的Ruby Gem库来监听文件变化。这个库支持glob展开文件路径,而且会记录一个叫*.sincedb*的数据库文件来跟踪被监听的日志文件的当前读取位置。所以,不要担心logstash会漏过你的数据。