手把手教你如何串接 log 到各種網路服務

99
手把手教你如何串接 log 各種網路服務 Kewang

Upload: mu-chun-wang

Post on 09-Jan-2017

1.047 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: 手把手教你如何串接 Log 到各種網路服務

手把手教你如何串接 log 到各種網路服務Kewang

Page 3: 手把手教你如何串接 Log 到各種網路服務

What Mitake is

三竹資訊● Qmi:企業內部即時通訊軟體● 全國最大的企業簡訊平台● 市佔近 100% 的行動下單● 市佔近 70% 的行動銀行● 企業內部應用、產壽險、金融相關政府機關● 其他:兌彩券、台灣匯率、三竹小股王、行動股市 ... 等

Page 4: 手把手教你如何串接 Log 到各種網路服務

4

Agenda

Page 5: 手把手教你如何串接 Log 到各種網路服務

5

Agenda

● 各 logger framework 簡單介紹

Page 6: 手把手教你如何串接 Log 到各種網路服務

6

Agenda

● 各 logger framework 簡單介紹● logback 內部架構

Page 7: 手把手教你如何串接 Log 到各種網路服務

7

Agenda

● 各 logger framework 簡單介紹● logback 內部架構● 如何用 logback 串接網路服務

Page 8: 手把手教你如何串接 Log 到各種網路服務

8

各 logger framework 簡單介紹interface & implementation

Page 9: 手把手教你如何串接 Log 到各種網路服務

9

logger framework

Page 10: 手把手教你如何串接 Log 到各種網路服務

10

logger framework

● slf4j

Page 11: 手把手教你如何串接 Log 到各種網路服務

11

logger framework

● slf4j● jcl

Page 12: 手把手教你如何串接 Log 到各種網路服務

12

logger framework

● slf4j● jcl● jul

Page 13: 手把手教你如何串接 Log 到各種網路服務

13

logger framework

● slf4j● jcl● jul● Log4j 1

Page 14: 手把手教你如何串接 Log 到各種網路服務

14

logger framework

● slf4j● jcl● jul● Log4j 1● Log4j 2

Page 15: 手把手教你如何串接 Log 到各種網路服務

15

logger framework

● slf4j● jcl● jul● Log4j 1● Log4j 2● Logback

Page 16: 手把手教你如何串接 Log 到各種網路服務

16

Page 17: 手把手教你如何串接 Log 到各種網路服務

17

logger 分類 - Interface

Page 18: 手把手教你如何串接 Log 到各種網路服務

18

logger 分類 - Interface

● slf4j - Simple Logging Facade for Java– 利用 Facade Pattern 提供一些 logging API ,可以轉換各種不同的 logger implementation

Page 19: 手把手教你如何串接 Log 到各種網路服務

19

logger 分類 - Interface

● slf4j - Simple Logging Facade for Java– 利用 Facade Pattern 提供一些 logging API ,可以轉換各種不同的 logger implementation

● jcl - Jakarta Commons Logging– Apache 開發出與 slf4j 類似功用的 library

Page 20: 手把手教你如何串接 Log 到各種網路服務

20

logger 分類 - Implementation

Page 21: 手把手教你如何串接 Log 到各種網路服務

21

logger 分類 - Implementation

● Logback - 今日主角

Page 22: 手把手教你如何串接 Log 到各種網路服務

22

logger 分類 - Implementation

● Logback - 今日主角● jul - java.util.logging

– Java 1.4 之後的內建 logger API

Page 23: 手把手教你如何串接 Log 到各種網路服務

23

logger 分類 - Implementation

● Logback - 今日主角● jul - java.util.logging

– Java 1.4 之後的內建 logger API● Log4j 1 - logging library for Java

– EOL @ 2015/8/5

Page 24: 手把手教你如何串接 Log 到各種網路服務

24

logger 分類 - Implementation

● Logback - 今日主角● jul - java.util.logging

– Java 1.4 之後的內建 logger API● Log4j 1 - logging library for Java

– EOL @ 2015/8/5● Log4j 2 - Interface + Implementation

Page 25: 手把手教你如何串接 Log 到各種網路服務

25

Page 26: 手把手教你如何串接 Log 到各種網路服務

26

logback 內部架構

Page 27: 手把手教你如何串接 Log 到各種網路服務

27

Architecture

Page 28: 手把手教你如何串接 Log 到各種網路服務

28

Architecture

● Logger– effective level– basic selection rule

Page 29: 手把手教你如何串接 Log 到各種網路服務

29

Architecture

● Logger– effective level– basic selection rule

● Appender– output destination– i.e. console, files, remote socket servers, DB, JMS, and

remote UNIX Syslog daemons

Page 30: 手把手教你如何串接 Log 到各種網路服務

30

Architecture

● Logger– effective level– basic selection rule

● Appender– output destination– i.e. console, files, remote socket servers, DB, JMS, and remote

UNIX Syslog daemons● Layout

– formatting the event to string

Page 31: 手把手教你如何串接 Log 到各種網路服務

31

Architecture - flow

● Get the filter chain decision● Apply the basic selection rule● Create a LoggingEvent object● Invoking appenders● Formatting the output● Sending out the LoggingEvent

Page 32: 手把手教你如何串接 Log 到各種網路服務

32

Architecture - sequence diagram

Page 33: 手把手教你如何串接 Log 到各種網路服務

33

Architecture - sequence diagram

Page 34: 手把手教你如何串接 Log 到各種網路服務

34

如何用 logback 串接網路服務

Page 35: 手把手教你如何串接 Log 到各種網路服務

35

logback.xml - 給使用者看的

Page 36: 手把手教你如何串接 Log 到各種網路服務

36

logback.xml - 給使用者看的<appender name="REDMINE" class="example.MyOwnAppender"> <url>http://example.com</url> <apiKey>abcdef1234567890</apiKey> <projectId>5566</projectId> <title>Logback Redmine Appender</title> <onlyError>true</onlyError> <encoder class="c.q.l.c.e.PatternLayoutEncoder"> <pattern>${PATTERN}</pattern> <charset>${CHARSET}</charset> </encoder></appender>

Page 37: 手把手教你如何串接 Log 到各種網路服務

37

logback.xml - 注意事項

Page 38: 手把手教你如何串接 Log 到各種網路服務

38

logback.xml - 注意事項● camelCase

Page 39: 手把手教你如何串接 Log 到各種網路服務

39

logback.xml - 注意事項● camelCase● follow the setter/getter JavaBeans conventions

Page 40: 手把手教你如何串接 Log 到各種網路服務

40

logback.xml - 注意事項● camelCase● follow the setter/getter JavaBeans conventions● only tag, no attribute

Page 41: 手把手教你如何串接 Log 到各種網路服務

41

logback.xml - 注意事項● camelCase● follow the setter/getter JavaBeans conventions● only tag, no attribute● Joran

Page 42: 手把手教你如何串接 Log 到各種網路服務

42

Template - 給開發者看的MyOwnAppender extends AppenderBase<ILoggingEvent> {

@Override protected void append(ILoggingEvent event) { }}

write log

Page 43: 手把手教你如何串接 Log 到各種網路服務

43

Template - 給開發者看的MyOwnAppender extends AppenderBase<ILoggingEvent> { @Override public void start() { super.start(); }

@Override protected void append(ILoggingEvent event) { }}

initialization

Page 44: 手把手教你如何串接 Log 到各種網路服務

44

start() - initialization

Page 45: 手把手教你如何串接 Log 到各種網路服務

45

start() - initialization

super.start();

Page 46: 手把手教你如何串接 Log 到各種網路服務

46

start() - initialization

if (!checkProperties()) { addError("Some message");

return;}

super.start();

Page 47: 手把手教你如何串接 Log 到各種網路服務

47

start() - initialization

if (!checkProperties()) { addError("Some message");

return;}

encoder.init(System.out);

super.start();

Page 48: 手把手教你如何串接 Log 到各種網路服務

48

start() - initialization

if (!checkProperties()) { addError("Some message");

return;}

encoder.init(System.out);

layout = encoder.getLayout();

super.start();

Page 49: 手把手教你如何串接 Log 到各種網路服務

49

start() - initialization

if (!checkProperties()) { addError("Some message");

return;}

encoder.init(System.out);

layout = encoder.getLayout();

initialProperties();

super.start();

Page 50: 手把手教你如何串接 Log 到各種網路服務

50

append(ILoggingEvent) - write log

Page 51: 手把手教你如何串接 Log 到各種網路服務

51

append(ILoggingEvent) - write log

String log = decorateLog(event);

Page 52: 手把手教你如何串接 Log 到各種網路服務

52

append(ILoggingEvent) - write log

String log = decorateLog(event);

writeLogToSomewhere(log);

Page 53: 手把手教你如何串接 Log 到各種網路服務

53

StackTraces

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

at com.hello.AppTest.testSms(AppTest.java:13)

Page 54: 手把手教你如何串接 Log 到各種網路服務

54

ILoggingEvent

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:

Page 55: 手把手教你如何串接 Log 到各種網路服務

55

ILoggingEvent

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:

event.getTimestamp()

Page 56: 手把手教你如何串接 Log 到各種網路服務

56

ILoggingEvent

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:

event.getTimestamp()

event.getThreadName()

Page 57: 手把手教你如何串接 Log 到各種網路服務

57

ILoggingEvent

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:

event.getTimestamp()

event.getThreadName()

event.getLevel()

Page 58: 手把手教你如何串接 Log 到各種網路服務

58

ILoggingEvent

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:

event.getTimestamp()

event.getThreadName()

event.getLevel()

event.getLoggerName()

Page 59: 手把手教你如何串接 Log 到各種網路服務

59

ILoggingEvent

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:

event.getTimestamp()

event.getThreadName()

event.getLevel()

event.getLoggerName()

event.getMessage()

Page 60: 手把手教你如何串接 Log 到各種網路服務

60

ILoggingEvent

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught:

event.getTimestamp()

event.getThreadName()

event.getLevel()

event.getLoggerName()

event.getMessage()

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

Page 61: 手把手教你如何串接 Log 到各種網路服務

61

IThrowableProxy

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

event.getThrowableProxy()

Page 62: 手把手教你如何串接 Log 到各種網路服務

62

IThrowableProxy

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

proxy.getClassName()

event.getThrowableProxy()

Page 63: 手把手教你如何串接 Log 到各種網路服務

63

IThrowableProxy

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

proxy.getClassName()

proxy.getMessage()

event.getThrowableProxy()

Page 64: 手把手教你如何串接 Log 到各種網路服務

64

StackTraceElement

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

at com.hello.AppTest.testSms(AppTest.java:13)

proxy .getStackTraceElementProxyArray()[n] .getStackTraceElement()

Page 65: 手把手教你如何串接 Log 到各種網路服務

65

StackTraceElement

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

at com.hello.AppTest.testSms(AppTest.java:13)

elem.getClassName()

proxy .getStackTraceElementProxyArray()[n] .getStackTraceElement()

Page 66: 手把手教你如何串接 Log 到各種網路服務

66

StackTraceElement

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

at com.hello.AppTest.testSms(AppTest.java:13)

elem.getClassName()

elem.getMethodName()

proxy .getStackTraceElementProxyArray()[n] .getStackTraceElement()

Page 67: 手把手教你如何串接 Log 到各種網路服務

67

StackTraceElement

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

at com.hello.AppTest.testSms(AppTest.java:13)

elem.getClassName()

elem.getMethodName()

elem.getFileName()

proxy .getStackTraceElementProxyArray()[n] .getStackTraceElement()

Page 68: 手把手教你如何串接 Log 到各種網路服務

68

StackTraceElement

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

at com.hello.AppTest.testSms(AppTest.java:13)

elem.getClassName()

elem.getMethodName()

elem.getFileName()

elem.getLineNumber()

proxy .getStackTraceElementProxyArray()[n] .getStackTraceElement()

Page 69: 手把手教你如何串接 Log 到各種網路服務

69

StackTraceElement

2016-10-03 22:00:09.174 [main] ERROR com.hello.Test - Caught: java.lang.RuntimeException: Oops

at com.hello.AppTest.testSms(AppTest.java:13)

elem.toString()

proxy .getStackTraceElementProxyArray()[n] .getStackTraceElement()

Page 70: 手把手教你如何串接 Log 到各種網路服務

70

Appenders @ kewang

Page 71: 手把手教你如何串接 Log 到各種網路服務

71

Appenders @ kewang

● logback-redmine-appender

● logback-sms-appender

Page 72: 手把手教你如何串接 Log 到各種網路服務

72

Appenders @ kewang

● logback-redmine-appender– merge the same StackTraces @ one issue

● logback-sms-appender

Page 73: 手把手教你如何串接 Log 到各種網路服務

73

Appenders @ kewang

● logback-redmine-appender– merge the same StackTraces @ one issue– link StackTraces with git repo

● logback-sms-appender

Page 74: 手把手教你如何串接 Log 到各種網路服務

74

Appenders @ kewang

● logback-redmine-appender– merge the same StackTraces @ one issue– link StackTraces with git repo– nested tag

● logback-sms-appender

Page 75: 手把手教你如何串接 Log 到各種網路服務

75

Appenders @ kewang

● logback-redmine-appender– merge the same StackTraces @ one issue– link StackTraces with git repo– nested tag

● logback-sms-appender– custom output

Page 76: 手把手教你如何串接 Log 到各種網路服務

76

Appenders @ kewang

● logback-redmine-appender– merge the same StackTraces @ one issue– link StackTraces with git repo– nested tag

● logback-sms-appender– custom output– only append ERROR level

Page 78: 手把手教你如何串接 Log 到各種網路服務

78

One more thing

Page 79: 手把手教你如何串接 Log 到各種網路服務

79

Logpushhttp://logpush.io

Page 80: 手把手教你如何串接 Log 到各種網路服務

80

Live DEMO

Page 81: 手把手教你如何串接 Log 到各種網路服務

81

Features

Page 82: 手把手教你如何串接 Log 到各種網路服務

82

Features

● one AP, multiple environments

Page 83: 手把手教你如何串接 Log 到各種網路服務

83

Features

● one AP, multiple environments● one environment, multiple subscriptions

Page 84: 手把手教你如何串接 Log 到各種網路服務

84

Features

● one AP, multiple environments● one environment, multiple subscriptions● RESTful API

Page 85: 手把手教你如何串接 Log 到各種網路服務

85

Features

● one AP, multiple environments● one environment, multiple subscriptions● RESTful API● ...... etc.

Page 86: 手把手教你如何串接 Log 到各種網路服務

86

logback-logpush-appender

<dependency> <groupId>io.logpush</groupId> <artifactId>logback-logpush-appender</artifactId> <version>0.1.0</version></dependency>

pom.xml

Page 87: 手把手教你如何串接 Log 到各種網路服務

87

logback-logpush-appender

<appender name="LOGPUSH" class="i.l.l.a.LogpushAppender"> <token>THIS_IS_LOGPUSH_TOKEN</token> <onlyError>true</onlyError> <encoder class="c.q.l.c.e.PatternLayoutEncoder"> <pattern>${PATTERN}</pattern> <charset>${CHARSET}</charset> </encoder></appender>

logback.xml

Page 88: 手把手教你如何串接 Log 到各種網路服務

88

Definition

● AP● Logpush Server● Firebase Cloud Messaging● Mobile device

Page 89: 手把手教你如何串接 Log 到各種網路服務

89

Log flow

Firebase Cloud MessagingLogpush Server

Mobile deviceAP

Page 90: 手把手教你如何串接 Log 到各種網路服務

90

Log flow - send log to Logpush

Firebase Cloud MessagingLogpush Server

Mobile deviceAP

send log via appender

Page 91: 手把手教你如何串接 Log 到各種網路服務

91

Log flow - send msg to FCM

Firebase Cloud MessagingLogpush Server

Mobile deviceAP

send

send log via appender

Page 92: 手把手教你如何串接 Log 到各種網路服務

92

Log flow - send log to subscription

Firebase Cloud MessagingLogpush Server

Mobile deviceAP

send

receivesend log via appender

Page 93: 手把手教你如何串接 Log 到各種網路服務

93

Log flow - other features

Firebase Cloud MessagingLogpush Server

Mobile deviceAP

send

receivesend log via appender RESTful

API

Page 94: 手把手教你如何串接 Log 到各種網路服務

94

Page 95: 手把手教你如何串接 Log 到各種網路服務

95

早期版本,請小力鞭

Page 96: 手把手教你如何串接 Log 到各種網路服務

96

早期版本,請小力鞭

Page 97: 手把手教你如何串接 Log 到各種網路服務

97

References

● http://logpush.io● Logback● jdk-logging log4j logback、 、 日志介绍及原理● slf4j jcl jul log4j1 log4j2 logback、 、 、 、 、 大总结● Log4j Log4j 2 Logback SFL4J JUL JCL、 、 、 、 、 的比较

Page 98: 手把手教你如何串接 Log 到各種網路服務

98

Page 99: 手把手教你如何串接 Log 到各種網路服務

99