sentry开发

来源:互联网 发布:106短信平台软件 编辑:程序博客网 时间:2024/06/05 14:08

需求

按照文档需求,需要获取的信息如下:

  • ID
    一个32位的数字,包含前后端标识4位(28~31)、模块名8位(20~27)、事件类型2位(18~19)、ID 编码8位(0~7)等信息

  • 级别
    调试日志分为ERROR、WARN、INFO、DEBUG 两类

  • jiffis
    CPU当前的jiffs值

  • 时间
    当前操作发生的时间

  • User
    当前操作的用户

  • 内容
    采用谓+宾结构典型如“Succeed in doing something ”、“Fail to do
    something”

  • 模块
    调试日志所归属的模块和信息

获取

sentry收集到的信息中都包含上述信息,所有只要找到sentry向服务器发送的位置,然后获取这些信息,在写入本地即可。
创建LogInfo.java记录所需要的信息,里面包括上述的所有内容。

package com.getsentry.bean;public class LogInfo {    String Id;    String Level;    String Jiffs;    String Time;    String User;    String Message;    String LineNumber;    String FuncName;    String ModelName;    public String getId() {        return Id;    }    public String getLevel() {        return Level;    }    public String getJiffs() {        return Jiffs;    }    public String getTime() {        return Time;    }    public String getUser() {        return User;    }    public String getMessage() {        return Message;    }    public String getModelName() {        return ModelName;    }    public void setId(String id) {        Id = id;    }    public void setLevel(String level) {        Level = level;    }    public void setJiffs(String jiffs) {        Jiffs = jiffs;    }    public void setTime(String time) {        Time = time;    }    public void setUser(String user) {        User = user;    }    public void setMessage(String message) {        Message = message;    }    public void setModelName(String modelName) {        ModelName = modelName;    }    public String generateString() {        return '[' + Id + ']' + '[' + Level + ']' +                '[' + Jiffs + ']' +                '[' + Time + ']' +                '[' + User + ']' +                '[' + Message + ']' +                '[' + ModelName + ']' + '\n'                ;    }}

当在发送处获取信息之后,利用LogInfo创建对象info,调用info的get方法,将信息保存到该对象中,最后把该对象写入本地

判断链接

按照需求,需要的是sentry连接不上服务器的时候才需要将所需信息写入本地,所以还需要在源码中找到判断链接的地方
判断链接的代码路径是 :

raven-log4j/src/main/java/com/getsentry/raven/connection/AsyncConnection.java

代码的判断部分如下

public void run() {            RavenEnvironment.startManagingThread();            try {                // The current thread is managed by raven                actualConnection.send(event);            } catch (LockedDownException e) {                lockdownLogger.warn("AsyncConnection The connection to Sentry is currently locked down.", e);            } catch (Exception e) {                logger.error("AsyncConnection An exception occurred while sending the event to Sentry.", e);                // add by fangbc start 链接失败,就将日志写入本地                AsyncConnection.writeContent(SentryAppender.logInfo.generateString());                // add by fangbc end            } finally {                RavenEnvironment.stopManagingThread();            }        }

该部分是判断链接是否成功的,在该方法中将获取的信息写入本地

写入本地

写入本地还需要指定写入的路径,为了方便后续,在配置文件log4j.properties中指定该路径
下面的代码从配置文件中读取路径,并将获取到的信息写入本地

// add by fangbc start 将获取到的信息写到本地。路径在log4j.properties中的LOG_PATH变量中指定。    public static void writeContent(String content) {        String fileName = "log4j.properties";        Properties props = new Properties();        try {            props.load(AsyncConnection.class.getClassLoader().getResourceAsStream(fileName));        } catch (IOException e) {            e.printStackTrace();        }        String PATH = props.getProperty("LOG_PATH");        FileOutputStream fop = null;        File file;        try {            file = new File(PATH);            fop = new FileOutputStream(file, true);            if (!file.exists()) {                file.createNewFile();            }            byte[] contentInBytes = content.getBytes();            fop.write(contentInBytes);            fop.flush();            fop.close();        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                if (fop != null) {                    fop.close();                }            } catch (IOException e) {                e.printStackTrace();            }        }    }    // add by fangbc end

这里的就是写入本地的方法

原创粉丝点击