• elk实践


    1、背景

    鉴于现在项目中的日志比较乱,所以建议使用现在较为流行的elk收集日志并展示;

    2下载、配置与启动

    下载 Elastic 产品 | Elastic 官网下载filebeat、logstash、elasticSearch、kibana 版本要一致 本人测试用的7.14 mac版本 实际生产使用7.14 linux版本

    2.1Filebeat:

    tar -zxvf filebeat-7.14.0-darwin-x86_64.tar.gz

    Cd filebeat-7.14.0-darwin-x86_64

    配置:filebeat.yml

    - type: log
      enabled: true
      paths:
        - /Users/admin/IdeaProjects/maijia-tebu/log/info/*.log
        - /Users/admin/IdeaProjects/taosj-aliexpress-data/log/*/*.log
      multiline.pattern: '^[0-9][0-9][0-9][0-9]'
      multiline.negate: true
      multiline.match: after
    output.logstash:
      hosts: ["localhost:5044”]

    sudo chown root:root /Users/admin/IdeaProjects/maijia-tebu/log/info root:为执行用户

    sudo chown root filebeat.yml

    测试配置 ./filebeat test config -e

    sudo ./filebeat -e

    配置说明:

    Paths:后面可以配置多个目录,配置的目录不会去递归,只会在最后的子目录里面寻找.log的文件;

    multiline:以 '^[0-9][0-9][0-9][0-9]' 格式后面的识别为一行,这样报错等信息就在一行了;

    output.logstash:logstash的地址;

    sudo chown admin:admin /Users/admin/IdeaProjects/maijia-tebu/log/info admin:为执行用户 给log目录设置权限

    sudo chown root filebeat.yml 给配置文件权限

    ./filebeat test config -e 测试配置

    sudo ./filebeat -e 启动

    2.2Logstash:

    tar -zxvf logstash-7.14.0-darwin-x86_64.tar.gz

    Cd logstash-7.14.0

    配置:

    Vi ./config/logstash-test.conf

    input {
      beats {
        port => 5044  
      }
    }
    filter{
       dissect {
          mapping => {
            "message" => "%{log_time}|%{ip}|%{serverName}|%{profile}|%{level}|%{logger}|%{thread}|%{traceId}|%{msg}" //与项目中的日志输出格式相对应
         }
       }
       date{
          match => ["log_time", "yyyy-MM-dd HH:mm:ss.SSS"]
          target => "@timestamp"
       }
    }
    output {
      elasticsearch {
        hosts => ["localhost:9200"]
        index => "logs-%{+YYYY.MM.dd}"  //创建索引的格式
      }
    }

    sudo ./bin/logstash -f config/logstash-test.conf

    2.3elaticSearch:

    tar -zxvf elasticsearch-7.14.0-darwin-x86_64.tar.gz

    Cd elasticsearch-7.14.0

    Sodu ./bin/elasticSearch

    检查服务:curl http://127.0.0.1:9200

    2.4kibana

    tar -zxvf kibana-7.14.0-darwin-x86_64.tar.gz

    Cd kibana-7.14.0-darwin-x86_64

    配置:如果es与kibana不在同一台服务器,在config/kibana.yml,添加 elasticsearch.url: "http://ip:port"

    Sudo ./bin/kibana

    检查:浏览器打开http://127.0.0.1:5601

    3、新建jar

    新建jar包  写一些工具类

    3.1Snowflake

    1. import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
    2. import com.baomidou.mybatisplus.core.toolkit.SystemClock;
    3. import java.io.Serializable;
    4. import java.util.Date;
    5. public class Snowflake implements Serializable {
    6. private static final long serialVersionUID = 1L;
    7. private final long twepoch;
    8. private final long workerIdBits = 5L;
    9. private final long dataCenterIdBits = 5L;
    10. // 最大支持数据中心节点数0~31,一共32个
    11. @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"})
    12. private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
    13. @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"})
    14. private final long maxDataCenterId = -1L ^ (-1L << dataCenterIdBits);
    15. // 序列号12位
    16. private final long sequenceBits = 12L;
    17. // 机器节点左移12位
    18. private final long workerIdShift = sequenceBits;
    19. // 数据中心节点左移17位
    20. private final long dataCenterIdShift = sequenceBits + workerIdBits;
    21. // 时间毫秒数左移22位
    22. private final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits;
    23. @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"})
    24. private final long sequenceMask = -1L ^ (-1L << sequenceBits);// 4095
    25. private final long workerId;
    26. private final long dataCenterId;
    27. private final boolean useSystemClock;
    28. private long sequence = 0L;
    29. private long lastTimestamp = -1L;
    30. /**
    31. * 构造
    32. *
    33. * @param workerId 终端ID
    34. * @param dataCenterId 数据中心ID
    35. */
    36. public Snowflake(long workerId, long dataCenterId) {
    37. this(workerId, dataCenterId, false);
    38. }
    39. /**
    40. * 构造
    41. *
    42. * @param workerId 终端ID
    43. * @param dataCenterId 数据中心ID
    44. * @param isUseSystemClock 是否使用{@link SystemClock} 获取当前时间戳
    45. */
    46. public Snowflake(long workerId, long dataCenterId, boolean isUseSystemClock) {
    47. this(null, workerId, dataCenterId, isUseSystemClock);
    48. }
    49. /**
    50. * @param epochDate 初始化时间起点(null表示默认起始日期),后期修改会导致id重复,如果要修改连workerId dataCenterId,慎用
    51. * @param workerId 工作机器节点id
    52. * @param dataCenterId 数据中心id
    53. * @param isUseSystemClock 是否使用{@link SystemClock} 获取当前时间戳
    54. * @since 5.1.3
    55. */
    56. public Snowflake(Date epochDate, long workerId, long dataCenterId, boolean isUseSystemClock) {
    57. if (null != epochDate) {
    58. this.twepoch = epochDate.getTime();
    59. } else {
    60. // Thu, 04 Nov 2010 01:42:54 GMT
    61. this.twepoch = 1288834974657L;
    62. }
    63. if (workerId > maxWorkerId || workerId < 0) {
    64. throw new IllegalArgumentException(format("worker Id can't be greater than {} or less than 0", maxWorkerId));
    65. }
    66. if (dataCenterId > maxDataCenterId || dataCenterId < 0) {
    67. throw new IllegalArgumentException(format("datacenter Id can't be greater than {} or less than 0", maxDataCenterId));
    68. }
    69. this.workerId = workerId;
    70. this.dataCenterId = dataCenterId;
    71. this.useSystemClock = isUseSystemClock;
    72. }
    73. /**
    74. * 根据Snowflake的ID,获取机器id
    75. *
    76. * @param id snowflake算法生成的id
    77. * @return 所属机器的id
    78. */
    79. public long getWorkerId(long id) {
    80. return id >> workerIdShift & ~(-1L << workerIdBits);
    81. }
    82. /**
    83. * 根据Snowflake的ID,获取数据中心id
    84. *
    85. * @param id snowflake算法生成的id
    86. * @return 所属数据中心
    87. */
    88. public long getDataCenterId(long id) {
    89. return id >> dataCenterIdShift & ~(-1L << dataCenterIdBits);
    90. }
    91. /**
    92. * 根据Snowflake的ID,获取生成时间
    93. *
    94. * @param id snowflake算法生成的id
    95. * @return 生成的时间
    96. */
    97. public long getGenerateDateTime(long id) {
    98. return (id >> timestampLeftShift & ~(-1L << 41L)) + twepoch;
    99. }
    100. /**
    101. * 下一个ID
    102. *
    103. * @return ID
    104. */
    105. public synchronized long nextId() {
    106. long timestamp = genTime();
    107. if (timestamp < lastTimestamp) {
    108. if (lastTimestamp - timestamp < 2000) {
    109. // 容忍2秒内的回拨,避免NTP校时造成的异常
    110. timestamp = lastTimestamp;
    111. } else {
    112. // 如果服务器时间有问题(时钟后退) 报错。
    113. throw new IllegalStateException(format("Clock moved backwards. Refusing to generate id for {}ms", lastTimestamp - timestamp));
    114. }
    115. }
    116. if (timestamp == lastTimestamp) {
    117. sequence = (sequence + 1) & sequenceMask;
    118. if (sequence == 0) {
    119. timestamp = tilNextMillis(lastTimestamp);
    120. }
    121. } else {
    122. sequence = 0L;
    123. }
    124. lastTimestamp = timestamp;
    125. return ((timestamp - twepoch) << timestampLeftShift) | (dataCenterId << dataCenterIdShift) | (workerId << workerIdShift) | sequence;
    126. }
    127. /**
    128. * 下一个ID(字符串形式)
    129. *
    130. * @return ID 字符串形式
    131. */
    132. public String nextIdStr() {
    133. return Long.toString(nextId());
    134. }
    135. // ------------------------------------------------------------------------------------------------------------------------------------ Private method start
    136. /**
    137. * 循环等待下一个时间
    138. *
    139. * @param lastTimestamp 上次记录的时间
    140. * @return 下一个时间
    141. */
    142. private long tilNextMillis(long lastTimestamp) {
    143. long timestamp = genTime();
    144. // 循环直到操作系统时间戳变化
    145. while (timestamp == lastTimestamp) {
    146. timestamp = genTime();
    147. }
    148. if (timestamp < lastTimestamp) {
    149. // 如果发现新的时间戳比上次记录的时间戳数值小,说明操作系统时间发生了倒退,报错
    150. throw new IllegalStateException(
    151. format("Clock moved backwards. Refusing to generate id for {}ms", lastTimestamp - timestamp));
    152. }
    153. return timestamp;
    154. }
    155. /**
    156. * 生成时间戳
    157. *
    158. * @return 时间戳
    159. */
    160. private long genTime() {
    161. return this.useSystemClock ? SystemClock.now() : System.currentTimeMillis();
    162. }
    163. public String format(String target, Object... params) {
    164. return target.contains("%s") && ArrayUtils.isNotEmpty(params) ? String.format(target, params) : target;
    165. }
    166. }

    3.2 TraceIdAdvice

    1. import com.alibaba.dubbo.rpc.RpcContext;
    2. import org.aopalliance.intercept.MethodInterceptor;
    3. import org.aopalliance.intercept.MethodInvocation;
    4. import org.slf4j.MDC;
    5. /** * 类 描 述:traceId切面
    6. */
    7. public class TraceIdAdvice implements MethodInterceptor {
    8. @Override
    9. public Object invoke(MethodInvocation invocation) throws Throwable {
    10. String tid = MDC.get("traceId");
    11. String rpcTid = RpcContext.getContext().getAttachment("traceId");
    12. if (tid != null) {
    13. RpcContext.getContext().setAttachment("traceId", tid);
    14. } else {
    15. if (rpcTid != null) {
    16. MDC.put("traceId",rpcTid);
    17. }
    18. }
    19. Object result = invocation.proceed();
    20. return result;
    21. }
    22. }

    3.3 TraceIdAdviceConfig

    1. import org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor;
    2. import org.springframework.beans.factory.annotation.Value;
    3. import org.springframework.context.annotation.Bean;
    4. import org.springframework.context.annotation.Configuration;
    5. /**
    6. * 类 描 述:traceId切面动态配置
    7. */
    8. @Configuration
    9. public class TraceIdAdviceConfig {
    10. @Value("${traceId.pointcut.property}")
    11. private String pointcut;
    12. @Bean
    13. public AspectJExpressionPointcutAdvisor configurabledvisor() {
    14. AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor();
    15. advisor.setExpression(pointcut);
    16. advisor.setAdvice(new TraceIdAdvice());
    17. return advisor;
    18. }
    19. }

    3.4 IPConverterConfig

    1. import ch.qos.logback.classic.pattern.ClassicConverter;
    2. import ch.qos.logback.classic.spi.ILoggingEvent;
    3. import java.net.InetAddress;
    4. import java.net.NetworkInterface;
    5. import java.net.UnknownHostException;
    6. import java.util.Enumeration;
    7. /**
    8. * 类 描 述:log打出ip
    9. */
    10. public class IPConverterConfig extends ClassicConverter {
    11. private String url;
    12. @Override
    13. public String convert(ILoggingEvent iLoggingEvent) {
    14. try {
    15. if (url == null){
    16. String hostAddress = getLocalHostLANAddress().getHostAddress();
    17. url = hostAddress;
    18. }
    19. return url;
    20. } catch (UnknownHostException e) {
    21. e.printStackTrace();
    22. }
    23. return null;
    24. }
    25. // 正确的IP拿法,即优先拿site-local地址
    26. private static InetAddress getLocalHostLANAddress() throws UnknownHostException{
    27. try {
    28. InetAddress candidateAddress = null;
    29. // 遍历所有的网络接口
    30. for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements();) {
    31. NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
    32. //服务器上eth0才是正确的ip
    33. if (!"eth0".equals(iface.getName())){
    34. continue;
    35. }
    36. // 在所有的接口下再遍历IP
    37. for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) {
    38. InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
    39. if (!inetAddr.isLoopbackAddress()) {// 排除loopback类型地址
    40. if (inetAddr.isSiteLocalAddress()) {
    41. // 如果是site-local地址,就是它了
    42. return inetAddr;
    43. } else if (candidateAddress == null) {
    44. // site-local类型的地址未被发现,先记录候选地址
    45. candidateAddress = inetAddr;
    46. }
    47. }
    48. }
    49. }
    50. if (candidateAddress != null) {
    51. return candidateAddress;
    52. }
    53. // 如果没有发现 non-loopback地址.只能用最次选的方案
    54. InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
    55. if (jdkSuppliedAddress == null) {
    56. throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null.");
    57. }
    58. return jdkSuppliedAddress;
    59. } catch (Exception e) {
    60. e.printStackTrace();
    61. }
    62. return null;
    63. }
    64. }

    3.5 TraceIdInterceptor

    1. /**
    2. * 类 描 述:traceId 用于追踪链路
    3. */
    4. @Slf4j
    5. @Component
    6. public class TraceIdInterceptor implements HandlerInterceptor {
    7. /*@Autowired
    8. RedisHelper redisHelper;*/
    9. Snowflake snowflake = new Snowflake(1,0);
    10. @Override
    11. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
    12. String tid = snowflake.nextIdStr();
    13. MDC.put("traceId",tid);
    14. RpcContext.getContext().setAttachment("traceId", tid);
    15. return true;
    16. }
    17. @Override
    18. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
    19. MDC.remove("traceId");
    20. }
    21. @Override
    22. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){}
    23. //生成导入批次号
    24. /*public String getTraceId() {
    25. String dateString = DateUtils.formatYYYYMMDD(new Date());
    26. Long incr = redisHelper.incr("taosj-common-traceId" + dateString, 24);
    27. if (incr == 0) {
    28. incr = redisHelper.incr("taosj-common-traceId" + dateString, 24);
    29. }
    30. DecimalFormat df = new DecimalFormat("000000");
    31. return dateString + df.format(incr);
    32. }*/
    33. }

    3.6 WebAppConfigurer

    1. import org.springframework.beans.factory.annotation.Autowired;
    2. import org.springframework.context.annotation.Configuration;
    3. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    4. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    5. /**
    6. * 类 描 述:TODO
    7. */
    8. @Configuration
    9. public class WebAppConfigurer implements WebMvcConfigurer {
    10. @Autowired
    11. private TraceIdInterceptor traceIdInterceptor;
    12. /**
    13. * 注册拦截器
    14. */
    15. @Override
    16. public void addInterceptors(InterceptorRegistry registry) {
    17. registry.addInterceptor(traceIdInterceptor).addPathPatterns("/**");
    18. //.excludePathPatterns("/admin/login")
    19. //.excludePathPatterns("/admin/getLogin");
    20. // - /**: 匹配所有路径
    21. // - /admin/**:匹配 /admin/ 下的所有路径
    22. // - /admin/*:只匹配 /admin/login,不匹配 /secure/login/tologin ("/*"只匹配一级子目录,"/**"匹配所有子目录)
    23. }
    24. }

    3.7 jar pom

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframeworkgroupId>
    4. <artifactId>spring-contextartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframeworkgroupId>
    8. <artifactId>spring-webmvcartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>com.alibabagroupId>
    12. <artifactId>dubboartifactId>
    13. dependency>
    14. <dependency>
    15. <groupId>org.slf4jgroupId>
    16. <artifactId>slf4j-apiartifactId>
    17. dependency>
    18. <dependency>
    19. <groupId>com.baomidougroupId>
    20. <artifactId>mybatis-plus-coreartifactId>
    21. dependency>
    22. <dependency>
    23. <groupId>ch.qos.logbackgroupId>
    24. <artifactId>logback-classicartifactId>
    25. dependency>
    26. <dependency>
    27. <groupId>org.apache.tomcat.embedgroupId>
    28. <artifactId>tomcat-embed-coreartifactId>
    29. dependency>
    30. dependencies>

     4、jar包的使用

    1、pom文件:

    添加自己的jar包

    2、启动类增加类扫描:步骤3的包名 

    3、配置文件增加切面pointcut配置:例如:traceId.pointcut.property=execution(public * com.taosj.tebu.service..*.*(..)) 自己项目的包名

    4、logback-spring文件修改:ip 日志输出格式

    spring.application.name"/>



    应该是把现在正在运行的日志拿过来,所以要把之前的日志删除掉,以及把形成的日志名改掉:

    比如${dir}/info/info.%d{yyyy-MM-dd}.%i.log 改成

    ${dir}/info/info.log.%d{yyyy-MM-dd}.%i

    5、springboot项目logback-spring.xml例子

    1. "1.0" encoding="UTF-8"?>
    2. <configuration>
    3. <springProfile name="dev">
    4. <property name="dir" value="log"/>
    5. springProfile>
    6. <springProfile name="test">
    7. <property name="dir" value="/data/project/taosj-tebu-web/code/logs"/>
    8. springProfile>
    9. <springProfile name="pre">
    10. <property name="dir" value="/data/project/taosj-tebu-web/code/logs"/>
    11. springProfile>
    12. <springProfile name="prod">
    13. <property name="dir" value="/data/project/taosj-tebu-web/code/logs"/>
    14. springProfile>
    15. <property resource="application.properties"/>
    16. <springProperty scope="context" name="serverName" source="spring.application.name"/>
    17. <conversionRule conversionWord="ip" converterClass="com.taosj.elk.config.IPConverterConfig"/>
    18. <property name="pattern" value="%date{yyyy-MM-dd HH:mm:ss} | %ip | ${serverName} | ${profile} | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %X{traceId} | %msg%n"/>
    19. <property name="pattern_log" value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%ip|${serverName}|${profile}|%level|%logger|%thread|%X{traceId}|%m%n"/>
    20. <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    21. <file>${dir}/info/info.logfile>
    22. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    23. <fileNamePattern>${dir}/info/info.log.%d{yyyy-MM-dd}.%ifileNamePattern>
    24. <maxFileSize>100MBmaxFileSize>
    25. <maxHistory>10maxHistory>
    26. <totalSizeCap>5GBtotalSizeCap>
    27. rollingPolicy>
    28. <filter class="com.taosj.bizlogback.LoggerFilter">
    29. <param name="levelMin" value="20000"/>
    30. <param name="levelMax" value="20000"/>
    31. filter>
    32. <encoder>
    33. <pattern>${pattern_log}pattern>
    34. <charset>UTF-8charset>
    35. encoder>
    36. appender>
    37. <appender name="DEBUG_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    38. <file>${dir}/debug/debug.logfile>
    39. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    40. <fileNamePattern>${dir}/debug/debug.%i.log.%d{yyyy-MM-dd}.%ifileNamePattern>
    41. <maxFileSize>100MBmaxFileSize>
    42. <maxHistory>10maxHistory>
    43. <totalSizeCap>5GBtotalSizeCap>
    44. rollingPolicy>
    45. <filter class="com.taosj.bizlogback.LoggerFilter">
    46. <param name="levelMin" value="10000"/>
    47. <param name="levelMax" value="10000"/>
    48. filter>
    49. <encoder>
    50. <pattern>${pattern_log}pattern>
    51. <charset>UTF-8charset>
    52. encoder>
    53. appender>
    54. <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    55. <file>${dir}/error/error.logfile>
    56. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    57. <fileNamePattern>${dir}/error/error.log.%d{yyyy-MM-dd}.%ifileNamePattern>
    58. <maxFileSize>100MBmaxFileSize>
    59. <maxHistory>10maxHistory>
    60. <totalSizeCap>5GBtotalSizeCap>
    61. rollingPolicy>
    62. <filter class="com.taosj.bizlogback.LoggerFilter">
    63. <param name="levelMin" value="40000"/>
    64. <param name="levelMax" value="40000"/>
    65. filter>
    66. <encoder>
    67. <pattern>${pattern_log}pattern>
    68. <charset>UTF-8charset>
    69. encoder>
    70. appender>
    71. <appender name="BIZ_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    72. <file>${dir}/biz/biz.logfile>
    73. <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    74. <fileNamePattern>${dir}/biz/biz.log.%d{yyyy-MM-dd}.%ifileNamePattern>
    75. <maxFileSize>100MBmaxFileSize>
    76. <maxHistory>10maxHistory>
    77. <totalSizeCap>5GBtotalSizeCap>
    78. rollingPolicy>
    79. <filter class="com.taosj.bizlogback.LoggerFilter">
    80. <param name="levelMin" value="50000"/>
    81. <param name="levelMax" value="50000"/>
    82. filter>
    83. <encoder>
    84. <pattern>${pattern_log}pattern>
    85. <charset>UTF-8charset>
    86. encoder>
    87. appender>
    88. <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    89. <encoder>
    90. <pattern>${pattern}pattern>
    91. encoder>
    92. appender>
    93. <springProfile name="dev">
    94. <root level="info">
    95. <appender-ref ref="INFO_LOG"/>
    96. <appender-ref ref="ERROR_LOG"/>
    97. <appender-ref ref="DEBUG_LOG"/>
    98. <appender-ref ref="BIZ_LOG"/>
    99. <appender-ref ref="console"/>
    100. root>
    101. springProfile>
    102. <springProfile name="prod">
    103. <root level="info">
    104. <appender-ref ref="INFO_LOG"/>
    105. <appender-ref ref="ERROR_LOG"/>
    106. <appender-ref ref="DEBUG_LOG"/>
    107. <appender-ref ref="BIZ_LOG"/>
    108. <appender-ref ref="console"/>
    109. root>
    110. springProfile>
    111. <springProfile name="test">
    112. <root level="info">
    113. <appender-ref ref="INFO_LOG"/>
    114. <appender-ref ref="ERROR_LOG"/>
    115. <appender-ref ref="DEBUG_LOG"/>
    116. <appender-ref ref="BIZ_LOG"/>
    117. <appender-ref ref="console"/>
    118. root>
    119. springProfile>
    120. <springProfile name="pre">
    121. <root level="info">
    122. <appender-ref ref="INFO_LOG"/>
    123. <appender-ref ref="ERROR_LOG"/>
    124. <appender-ref ref="DEBUG_LOG"/>
    125. <appender-ref ref="BIZ_LOG"/>
    126. <appender-ref ref="console"/>
    127. root>
    128. springProfile>
    129. configuration>

    7、部署时候的小tip:

    7.1:filebeat启动时

    nohup ./filebeat & 这样shell关闭了还是会停

    nohup ./filebeat & disown 要这样启动

    7.2: filebeat推送logstash的地址:

    116.62.126.104 35044 可以查看filebeat.yml配置文件

    7.4:ip

    ip获取的是eth0网卡的ip

    7.4:小问题

    springmvc项目使用log4j不能一开始就注入servername、ip、profile等信息 所以启动等信息没有这些字段,调用接口等是有这些信息的;springboot项目使用logback没有这个问题

     

  • 相关阅读:
    UML是什么?UML概念模型?用例图,类图,活动图,状态图
    模糊控制器实现对某个对象追踪输入
    23_ue4进阶末日生存游戏开发[随机巡逻]
    读后感读后感读后感
    【web-避开客户端控件】(2.3.5)收集使用数据:反编译浏览器扩展
    理论辐照度计算
    Oracle 定时任务job实际应用
    面试、工作中常用sql大全(建议收藏备用)
    集合的增删改查?--Python
    Python大作业——爬虫+可视化+数据分析+数据库(可视化篇)
  • 原文地址:https://blog.csdn.net/gzc_870301/article/details/128012859