java 中怎么将程序出现的异常信息保存到日志文件中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 中怎么将程序出现的异常信息保存到日志文件中相关的知识,希望对你有一定的参考价值。

有一个叫log4j的组件下载后放在lib文件夹下,设置配置文件.
然后在你的类中创建这个的对象 ,这个对象的构造器需要这个类的完整名,例如:
private static final Logger logger = Logger.getLogger(xxx.class);
然后在你需要的地方使用这个对象,例如:
logger.info(message);
log4j有三种级别,info,error,debug,在配置文件中可以配置保存的路径,保存的级别
参考技术A 用getMessage()方法获取的异常信息实际就是一个字符串,而日志文件一般都是txt格式的吧。和把普通字符串写入到txt文件没区别。 参考技术B log4j的,配置一下,写个共同类,就可以使用了,网上有很多这个教程的 参考技术C logger.error(" ",e);

SpringBoot入门二十一,全局异常处理

一共两个文件,一个处理全局异常,保存信息到日志,另外一个负责返回异常信息给接口,只要将其文件添加到项目中,无需再做其他配置即可

1. MyExceptionHandler.java 全局异常处理类

优先执行此类,这里不好抓取404、403等错误信息
getMaps()请参考获取request中传递过来的参数信息
getHeaders()请参考获取request中传递过来的header信息
代码如下:

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

/**
 * <h5>描述:全局异常处理类</h5>
 * 优先执行此异常处理类
 *  
 */
@ControllerAdvice
public class MyExceptionHandler {
    private final Logger log = LoggerFactory.getLogger(getClass());

    @ExceptionHandler(value =Exception.class)
    public String exceptionHandler(HttpServletRequest request, Exception e){
        Map<String, Object> paramsMap = getMaps(request);
        Map<String, Object> headersMap = getHeaders(request);

        String requestUri = request.getAttribute("org.springframework.web.servlet.HandlerMapping.lookupPath").toString();
        log.error("请求[{}]发生[{}]异常
参数[{}]
header[{}]", requestUri,e.getMessage(),paramsMap,headersMap, e);

        // 返回错误信息,交给其他异常处理类处理
        return e.getMessage();
    }

    // =================== private method ===================

    /**
     * <h5>功能:获取从request中传递过来的参数信息</h5>
     * 
     * @return Map<String, Object>
     */
    private Map<String, Object> getMaps(HttpServletRequest request){
        Map<String, Object> paramMap = new HashMap<String, Object>();
        Enumeration<String> enume = request.getParameterNames();
        while (enume.hasMoreElements()) {
            String key = (String) enume.nextElement();
            String[] values = request.getParameterValues(key);
            paramMap.put(key, values.length == 1 ? request.getParameter(key).trim() : values);
        }

        return paramMap;
    }

    /**
     * <h5>功能: 获取从request中传递过来的header信息</h5>
     * 
     * @return Map<String, Object>
     */
    private Map<String, Object> getHeaders(HttpServletRequest request) {
        Map<String, Object> headerMap = new HashMap<String, Object>();
        Enumeration<?> er = request.getHeaderNames();//获取请求头的所有name值
        String headerName;
        while(er.hasMoreElements()){
            headerName = er.nextElement().toString();
            headerMap.put(headerName, request.getHeader(headerName));
        }

        return headerMap;
    }
}

2. MyErrorController.java 全局错误信息处理类

后执行此类,此类可以有效抓取,404、403等信息,代码如下:

import javax.servlet.http.HttpServletRequest;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.alibaba.fastjson.JSONObject;
import com.jnxj.common.vo.MessageBean;

/**
 * <h5>描述:全局错误信息处理</h5>
 *  执行完异常处理类之后执行此类
 */
@RestController
public class MyErrorController implements ErrorController {

    @Override
    public String getErrorPath() {
        return "/error";
    }

    @RequestMapping("/error")
    public String handleError(HttpServletRequest request) {
        String message;
        // 获取statusCode:401,404,500
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == 400) {
            message = "语义有误,当前请求无法被服务器理解或请求参数有误";
        } else if (statusCode == 401) {
            message = "当前请求需要用户验证";
        } else if (statusCode == 403) {
            message = "权限不足";
        } else if (statusCode == 404) {
            message = "请求的资源不存在";
        } else {
            message = "系统不小心生病了,正在紧急修复中,请耐心等候...o(╥﹏╥)o";
        }

        MessageBean messageBean = new MessageBean();
        messageBean.setCode(statusCode.toString());
        messageBean.setMessage(message);
        return JSONObject.toJSONString(messageBean);
    }
}

以上是关于java 中怎么将程序出现的异常信息保存到日志文件中的主要内容,如果未能解决你的问题,请参考以下文章

Java核心技术卷一 5. java异常断言和日志

Django日志配配置

打印异常信息到日志

java 创建一个log日志

在cmd中使用“>”保存输出信息到日志时怎么实现将日志文件名以该机器名命名?

SpringBoot入门二十一,全局异常处理