logback 使用mysql 性能差_实战分析:Spring boot logback 异常日志发送http请求,记录到数据库...

言归正传,项目中有个功能:

线上项目一旦报错,将报错信息通过http请求发送到自己部署开发环境服务器项目中

将处理一下http请求信息存起来,就是一个小型的异常数据库,

当然也实现了开发环境查库然后界面化,这个就是一个后台系统展现就不说了

主要想学习一下,如何将错误日志收集并发送,并加上自己的感悟和注释记录一下

ps:为了一些敏感的信息吧 我就统一将所有敏感的替换的改为test  或者****号了

在application.properties中

配置logging.level.*来具体输出哪些包的日志级别

logging.level.root=infologging.level.com.****.web=debug#当然可以设置日志文件输出路径以及文件logging.file=logs/web.log

HTML

2、Logback默认配置的步骤

(1). 尝试在 classpath 下查找文件 logback-test.xml;

(2). 如果文件不存在,则查找文件 logback.xml;

(3). 如果两个文件都不存在,logback 用 Bas icConfigurator 自动对自己进行配置,这会导致记录输出到控制台。

logback.xml

<?xml version="1.0" encoding="UTF-8"?>     http://localhost:8098/-->                                                                                                        ${CONSOLE_LOG_PATTERN}            utf8                              logs/web.%d{yyyy-MM-dd}.log      30              %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n                                0                8196                                                    error            ACCEPT            DENY            -->

HTML

控制台输出就是照旧输出,会有特别整齐的格式和彩色配置,这个格式网上很多,就略过了

文件logs就根据配置文件生成了在项目中,文件夹,文件名,日期一样不落

1420679682fa

还有剩下半句配置,我一贴日志里面的文件内容,日期/等级啥的一一对应,本来{}里面的翻译也挺准确的

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n

HTML

1420679682fa

接下来写数据库部分了看到

HTML

AsyncAppender这个类,logback高级特性使用(三)里面说的很详细,文章说因此AsynAppender仅仅充当事件转发器,必须引用另一个appender来做事。就是" "这句话,再接着DBOUT往里面看看配置

原来所有的error日志都让filter过滤了给了appender指定的class类了(代码中的DBloggerAppender)

                                            error            ACCEPT            DENY       

HTML

指定的这个自己写的DBloggerAppender类,就是自定义Appender,

那这个Appender有什么讲究吗,去翻翻官方文档(文章最上面那个链接)

1420679682fa

仔细一看类名ConsoleAppender和FileAppender,就知道这两个类是干嘛的了,

在往上一级OutputStreamAppender,这个明显就是IO流才用到的,pass

那我的自定义Appender咋办,再往上啊 UnsynchronizedAppenderBase

这个在官方API文档也有说明,但是英语渣渣的我,还是看看其他资料吧

实现Appender接口有2个base类,一个是AppenderBase,另一个是UnsynchronizedAppenderBase,这2个类非常接近,80%以上的代码都是相同的。

如果我们自己要自定义Appender的话,只要写一个类继承自这2个base类就好

下面看一个简单的Appender,就是我自己写的MyAppender

public class MyAppender extends AppenderBase {

@Override

protected void append(LoggingEvent eventObject) {

System.out.println(eventObject.getMessage());

}

}

看完以后,哦,原来要重写一下Append方法,再回过头看项目DbLoggerAppender代码,果不其然

public class DbLoggerAppender extends UnsynchronizedAppenderBase {    @Overrideprotected void append(LoggingEvent le) {          //业务处理    }}

Java

到了这一步,基本上就差不多明了日志如何实现自定义的,接下来业务方法具体实现,大部分都贴注释吧.

看官到这里就可以撤了,下面是具体的业务

我自己make学习一下,剖析一下代码是怎么写的,

package com.****.web;import java.net.InetAddress;import java.util.HashMap;import java.util.Map;import org.springframework.beans.BeansException;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.BeanFactoryAware;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.stereotype.Component;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.web.client.RestTemplate;import com.fasterxml.jackson.databind.ObjectMapper;import ch.qos.logback.classic.spi.IThrowableProxy;import ch.qos.logback.classic.spi.LoggingEvent;import ch.qos.logback.classic.spi.StackTraceElementProxy;import ch.qos.logback.classic.spi.ThrowableProxy;import ch.qos.logback.classic.spi.ThrowableProxyUtil;import ch.qos.logback.core.CoreConstants;import ch.qos.logback.core.UnsynchronizedAppenderBase;public class DbLoggerAppender extends UnsynchronizedAppenderBase {@Overrideprotected void append(LoggingEvent le) {try {/*这个和配置是一一对应的,贴上logback.xml的代码http://localhost:8098/-->    */String logUrl = context.getProperty("logUrl") + "saveprogramlog";            String content = le.getFormattedMessage();//异常内容,就是log.error("出错", e);的内容//如果没有就是以下内容了,例如(贴多点,方便大家理解)//{dataSource-11} init error//uriSessionMapFullCount is full//session ip change too many//Application run failed/*-->

***************************

APPLICATION FAILED TO START

***************************

Description:

Web server failed to start. Port 8088 was already in use.

Action:

Identify and stop the process that's listening on port 8088 or configure this application to listen on another port.

*/Map log = new HashMap();log.put("timestamp", le.getTimeStamp() );log.put("level", le.getLevel().levelStr);log.put("content", content);log.put("serviceName", "WEB");//给这个服务起个别名 Spring boot可是多服务的...log.put("serviceIP", InetAddress.getLocalHost().getHostAddress());//主机IPStringBuilder builder = new StringBuilder();//这个builder 得到的内容就是密密麻麻的报错信息  有缩进和换行的那种//具体实现我也不懂..希望有大拿评论贴链接或者剖析..IThrowableProxy thProxy = le.getThrowableProxy();while (thProxy != null) {builder.append(thProxy.getClassName() + ": " + thProxy.getMessage() );builder.append(CoreConstants.LINE_SEPARATOR);        for (StackTraceElementProxy step : le.getThrowableProxy().getStackTraceElementProxyArray()) {            String string = step.toString();            builder.append(CoreConstants.TAB).append(string);            ThrowableProxyUtil.subjoinPackagingData(builder, step);            builder.append(CoreConstants.LINE_SEPARATOR);        }        thProxy = thProxy.getCause();}                log.put("cause", builder.toString());                //json序列化ObjectMapper om = new ObjectMapper();String logJson = om.writeValueAsString(log);HttpHeaders headers = new HttpHeaders();// 提交方式,大部分的情况下,提交方式都是表单提交headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);MultiValueMap map= new LinkedMultiValueMap();map.add("log", logJson);HttpEntity> request = new HttpEntity>(map, headers);RestTemplate restTemplate = new RestTemplate();restTemplate.postForEntity( logUrl, request , String.class );} catch (Exception ex) {ex.printStackTrace();}}}

Java

https://www.smwenku.com/a/5b87b0bf2b71775d1cd87f80/zh-cn/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值