Wrecked

Holding You Back As I Breath You In


  • 首页

  • 关于

  • 标签26

  • 分类15

  • 归档34

  • 搜索

Logback

发表于 2019-11-19 | 更新于 2019-11-20 | 分类于 Logback |

标签

1
2
3
4
5
6
appender:定义了打印过滤的条件、打印输出方式、滚动策略、编码方式、打印格式等等
root: 是根logger
logger: 指定某些应用具体的日志输出方式
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

Appender

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 appender:种类
1.ConsoleAppender:把日志添加到控制台
2.FileAppender:把日志添加到文件
3.RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。它是FileAppender的子类

appender过滤器:
1.ThresholdFilter临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>

2.LevelFilter级别过滤器,根据日志级别进行过滤。如果日志级别等于配置级别,过滤器会根据onMath(用于配置符合过滤条件的操作) 和 onMismatch(用于配置不符合过滤条件的操作)接收或拒绝日志。
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
DENY:日志将立即被抛弃不再经过其他过滤器
NEUTRAL:有序列表里的下个过滤器过接着处理日志
ACCEPT:日志会被立即处理,不再经过剩余过滤器
appender file 子标签:
标签用于指定被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
<file>
${logging.path}/glmapper-spring-boot/SERVICE-USER.log
</file>
rollingPolicy 子标签
这个子标签用来描述滚动策略的。这个只有appender的class是RollingFileAppender时才需要配置。这个也会涉及文件的移动和重命名(a.log->a.log.2018.07.22)。
TimeBasedRollingPolicy 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。这个下面又包括了
FileNamePattern 日志文件输出的文件名:按天回滚 daily
maxHistory 日志文件保留天数
encoder 子标签
记录事件进行格式化。它干了两件事:
把日志信息转换成字节数组
把字节数组写入到输出流


<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>

logger

1
2
3
4
5
6
7
8
9
             <logger name="com.spring.boot.controller"
level="${logging.level}" additivity="false">
<appender-ref ref="SERVICE-USER" />
</logger>

上面的这个配置文件描述的是:com.spring.boot.controller这个包下的${logging.level}级别的日志将会使用SERVICE-USER来打印。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别(TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF),还有一个值INHERITED或者同义词NULL,代表强制执行上级的级别。如果没有设置此属性,那么当前logger将会继承上级的级别。
addtivity:用来描述是否向上级logger传递打印信息。默认是true。

示例

<!--每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录-->
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="false" scanPeriod="60 seconds" debug="false">
<!-- 定义日志的根目录 -->
<property name="LOG_HOME" value="/app/log" />
<!-- 定义日志文件名称 -->
<property name="appName" value="nasus-springboot"></property>
<!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <!--
    日志输出格式:
        %d表示日期时间,
        %thread表示线程名,
        %-5level:级别从左显示5个字符宽度
        %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 
        %msg:日志消息,
        %n是换行符
    -->
    <layout class="ch.qos.logback.classic.PatternLayout">
        <springProfile name="dev">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern>
        </springProfile>
        <springProfile name="!dev">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern>
        </springProfile>
    </layout>
</appender>

<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->  
<appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 指定日志文件的名称 -->
    <file>${LOG_HOME}/${appName}.log</file>
    <!--
    当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
    TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。
    -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--
        滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动 
        %i:当文件大小超过maxFileSize时,按照i进行文件滚动
        -->
        <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
        <!-- 
        可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
        且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件是,
        那些为了归档而创建的目录也会被删除。
        -->
        <MaxHistory>365</MaxHistory>
        <!-- 
        当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置timeBasedFileNamingAndTriggeringPolicy
        -->
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>100MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <!-- 日志输出格式: -->     
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
    </layout>
</appender>

<!-- 
    logger主要用于存放日志对象,也可以定义日志类型、级别
    name:表示匹配的logger类型前缀,也就是包的前半部分
    level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
    additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
    false:表示只用当前logger的appender-ref,true:
    表示当前logger的appender-ref和rootLogger的appender-ref都有效
-->
<!-- hibernate logger -->
<logger name="com.nasus" level="debug" />
<!-- Spring framework logger -->
<logger name="org.springframework" level="debug" additivity="false"></logger>



<!-- 
root 与 logger 是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的appender和level。 
-->
<root level="info">
    <appender-ref ref="stdout" />
    <appender-ref ref="appLogAppender" />
</root>
 </configuration> 

Btrace 远程调试

发表于 2019-11-13 | 分类于 Java |

Btrace GitHub链接

下载Btrace到本地
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

$ wget https://github.com/btraceio/btrace/releases/download/v1.3.11.3/btrace-bin-1.3.11.3.zip

$ unzip btrace-bin-1.3.11.3.zip -d ./btrace //解压到指定文件夹


$ vim /etc/profile
export BTRACE_HOME=/home/btrace; ## btrace安装目录
export PATH=$PATH:$BTRACE_HOME/bin;


$ btrace --version
BTrace v.1.3.11.3 (20181217)


$ jps //查看Java项目进程Pid 也可以 ps -ef |grep xxx

13890 Bootstrap


$ cd /home/btrace/bin

$ btrace 13890 ../samples/AllMethods.java //btrace <PID> XXX.java 执行命令

属性注解

1
@TLS标注的属性可以在追踪脚本的方法中通讯

方法注解
1
2
3
4
5
6
7
8
9
10
11
@OnMethod:指定该方法在什么情况下被执行,clazz属性指定要跟踪的类的全限定类名,也可以用正则表达式,
“/类名的Pattern/”匹配,如/javax\\.swing\\..*/;用”+类名”追踪所有子类,
如+java.lang.Runnable;用”@xxx”追踪用该注解注解过的类,
如@javax.jws.WebService。method属性指定要追踪的方法名称,也可以用正则表达式。
location属性用@Location来指定该方法在目标方法执行前(后、异常、某行、某个方法调用)被执行。
@OnTimer:定时执行该方法。
@OnExit:当脚本运行Sys.exit(code)时执行该方法。
@OnError:当脚本运行抛出异常时执行该方法。
@OnEvent:脚本运行时Ctrl+C可以发送事件。
@OnLowMemory:指定一个内存阀值,低于阀值值执行该方法。
@OnProbe:指定一个xml文件来描述在什么时候执行该方法。
方法参数注解
1
2
3
4
5
6
7
8
@Self:指目标对象本身。
@Retrun:指目标程序方法返回值(需要配合Kind.RETURN)。
@ProbeClassName:指目标类名。
@ProbeMethodName:指目标方法名。
@targetInstance:指@Location指定的clazz和method的目标(需要配合Kind.CALL)。
@targetMethodOrField:指@Location指定的clazz和method的目标的方法或字段(需要配合Kind.CALL)。
@Duration:指目标方法执行时间,单位是纳秒(需要需要配合Kind.RETURN或Kind.ERROR一起使用)。
AnyType:获取对应请求的参数,泛指任意类型。
追踪时机参数
1
2
3
4
5
6
7
8

Kind.Entry:开始进入目标方法时,默认值?。
Kind.Return:目标方法返回时。
Kind.Error:异常没被捕获被抛出目标方法之外时?。
Kind.Throw:异常抛出时?。
Kind.Catch:异常被捕获时。
Kind.Call:被调用时。
Kind.Line:执行到某行时。

Btrace 实例Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

import com.sun.btrace.annotations.*;
import com.sun.btrace.services.impl.Printer;
import com.sun.btrace.AnyType;
import com.sun.btrace.BTraceUtils;

import java.lang.reflect.Field;


/**
* 拦截时机
* 不写Location,默认就是刚进入函数的时候(Kind.ENTRY)
* 异常抛出(Throw),
* 异常被捕获(Catch),
* 异常没被捕获被抛出函数之外(Error),主要用于对某些异常情况的跟踪。
* clazz 类名
* method 方法名
*/
@BTrace
public class DappDemo {
@Injected(ServiceType.RUNTIME)
private static Printer printer;
@TLS
static long beginTime;

@OnMethod(clazz = "com.xxx", method = "xxx")
public static void getTime() {
beginTime = BTraceUtils.timeMillis();
}

@OnMethod(clazz = "com.xxx", method = "xxx", location = @Location(value = Kind.RETURN))
public static void btraceDemo(@Self Object self,Integer chain, @ProbeClassName String probeClass, @ProbeMethodName String probeMethod, @Return AnyType result) {
//打印耗时
printer.println(" 耗时--->[" + (BTraceUtils.timeMillis() - beginTime) + "]" + " ms");
//打印类名
printer.println(" ClassName--->[" + probeClass + "]");
//打印方法名
printer.println("MethodName--->[" + probeMethod + "]");
//打印入参
printer.println(" Param--->chain: [" + chain + "]");

printer.println(" Result--->[" + result);


printer.println("当前Name属性值: " +BTraceUtils.get(BTraceUtils.field(BTraceUtils.classForName("com.XXX",BTraceUtils.contextClassLoader()), name(属性昵称), result));
//打印耗时
printer.println(" ==============");

}

}

Navicat Premium 12永久激活

发表于 2019-11-08 | 分类于 Mysql |

一、下载Navicat Premium 12并安装 官网地址

二、点击注册机下载

三、激活Navicat Premium 12

1
1、以管理员身份运行注册机
1
2、打开注册机后,在1) Patch,勾选Backup、Host和Navicat v12,然后点击Patch按钮:

如图

1
2
3.找到Navicat Premium 12安装路径下的navicat.exe,选中并点击打开。
此时出现如下弹窗,提示navicat.exe - x64 -> Cracked.,提示已破解(别高兴,还没结束)。若提示libcc.dll或navicat.exe出错,检查是否未关闭Navicat Premium,或到安装目录下将libcc.dll和navicat.exe删除,并将libcc.dll.BAK或navicat.exe.BAK去掉.BAK后缀名。否则卸载已安装的Navicat Premium并清理文件残留和注册表残留:

如图

1
4. Keygen / Offline Activation,点击Generate,将自动生成SerialKeygen(注册码)

如图

1
5.打开Navicat Premium 12,点击菜单栏的帮助,选择注册,在注册窗口键处填入上一步生成的Serial Keygen(即注册码),然后点击激活:

如图

1
2
6.点击手动激活:
将Navicat手动激活窗口的请求码框中内容复制到注册机Request Code框中,点击Activation Code下面的Generate按钮(若此处出现错误,要么你未完全按照教程来,要么你所安装的版本高于注册机所支持的版本):

如图

1
7.将注册机Activation Code处生成的激活码内容复制到Navicat手动激活窗口的激活码框中(或点击Activation Code处下面的Copy按钮,这样会自动粘贴到Navicat手动激活窗口的激活码框中),然后点击激活按钮:

如图
如图

1…345…12
Wrecked

Wrecked

34 日志
15 分类
26 标签
RSS
GitHub E-Mail
Links
  • WeChat
  • Java2s
© 2020 本博客所有文章除特别声明外。转载请注明出处!