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

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

Jan 09, 2017

Download

Technology

Mu Chun Wang
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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