Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
加钱居士.
foot
提交
30e22036
F
foot
项目概览
加钱居士.
/
foot
通知
3
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
foot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
30e22036
编写于
3月 21, 2020
作者:
S
shi.zeyuan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.xxx
上级
1ae91420
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
136 addition
and
0 deletion
+136
-0
FC000.go
FC000.go
+11
-0
FW000.go
FW000.go
+0
-0
blog/golang日志框架zap简洁配置.md
blog/golang日志框架zap简洁配置.md
+125
-0
未找到文件。
FC000.go
0 → 100644
浏览文件 @
30e22036
package
main
import
"tesou.io/platform/foot-parent/foot-api/common/base"
func
main
()
{
base
.
Log
.
Info
(
"日志1"
)
base
.
Log
.
Info
(
"日志2"
)
base
.
Log
.
Error
(
"错误的日志"
)
base
.
Log
.
Info
(
"日志3"
)
}
F
C000Application
.go
→
F
W000
.go
浏览文件 @
30e22036
文件已移动
blog/golang日志框架zap简洁配置.md
0 → 100644
浏览文件 @
30e22036
#golang日志框架zap简洁配置
##$ 前言
*
zap是uber开源的一款高性能日志组件框架
##$ 配置目标
*
错误信息独立的文件记录
*
日志按天分割,一天一个文件
*
只保留近七天的日志
*
错误日志输出堆栈
## 源码
~~~
package
base
import
(
"fmt"
rotatelogs
"github.com/lestrrat-go/file-rotatelogs"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"io"
"os"
"time"
)
var
Log
*
zap
.
SugaredLogger
const
(
output_dir
=
"./logs/"
out_path
=
"foot.log"
err_path
=
"foot.err"
)
func
init
()
{
_
,
err
:=
os
.
Stat
(
output_dir
)
if
err
!= nil {
if
os
.
IsNotExist
(
err
)
{
err
:=
os
.
Mkdir
(
output_dir
,
os
.
ModePerm
)
if
err
!= nil {
fmt
.
Printf
(
"mkdir failed![%v]
\n
"
,
err
)
}
}
}
//
设置一些基本日志格式
具体含义还比较好理解,直接看
zap
源码也不难懂
encoder
:=
zapcore
.
NewConsoleEncoder
(
zapcore
.
EncoderConfig
{
MessageKey
:
"msg"
,
LevelKey
:
"level"
,
TimeKey
:
"ts"
,
//
CallerKey
:
"file"
,
CallerKey
:
"caller"
,
StacktraceKey
:
"trace"
,
LineEnding
:
zapcore
.
DefaultLineEnding
,
EncodeLevel
:
zapcore
.
LowercaseLevelEncoder
,
//
EncodeLevel
:
zapcore
.
CapitalLevelEncoder
,
EncodeCaller
:
zapcore
.
ShortCallerEncoder
,
EncodeTime
:
func
(
t
time
.
Time
,
enc
zapcore
.
PrimitiveArrayEncoder
)
{
enc
.
AppendString
(
t
.
Format
(
"2006-01-02 15:04:05"
))
},
//
EncodeDuration
:
zapcore
.
SecondsDurationEncoder
,
EncodeDuration
:
func
(
d
time
.
Duration
,
enc
zapcore
.
PrimitiveArrayEncoder
)
{
enc
.
AppendInt64
(
int64
(
d
)
/
1000000
)
},
})
//
实现两个判断日志等级的
interface
infoLevel
:=
zap
.
LevelEnablerFunc
(
func
(
lvl
zapcore
.
Level
)
bool
{
return
true
})
warnLevel
:=
zap
.
LevelEnablerFunc
(
func
(
lvl
zapcore
.
Level
)
bool
{
return
lvl
>=
zapcore
.
WarnLevel
})
//
获取
info
、
warn
日志文件的
io
.
Writer
抽象
getWriter
()
在下方实现
infoHook_1
:=
os
.
Stdout
infoHook_2
:=
getWriter
(
out_path
)
errorHook
:=
getWriter
(
err_path
)
//
最后创建具体的
Logger
core
:=
zapcore
.
NewTee
(
zapcore
.
NewCore
(
encoder
,
zapcore
.
AddSync
(
infoHook_1
),
infoLevel
),
zapcore
.
NewCore
(
encoder
,
zapcore
.
AddSync
(
infoHook_2
),
infoLevel
),
zapcore
.
NewCore
(
encoder
,
zapcore
.
AddSync
(
errorHook
),
warnLevel
),
)
//
需要传入
zap
.
AddCaller
()
才会显示打日志点的文件名和行数
,
有点小坑
logger
:=
zap
.
New
(
core
,
zap
.
AddCaller
(),
zap
.
AddStacktrace
(
zap
.
ErrorLevel
))
Log
=
logger
.
Sugar
()
defer
logger
.
Sync
()
}
func
getWriter
(
filename
string
)
io
.
Writer
{
//
生成
rotatelogs
的
Logger
实际生成的文件名
demo
.
log
.
YYmmddHH
//
demo
.
log
是指向最新日志的链接
//
保存
7
天内的日志,每
1
小时
(
整点
)
分割一次日志
hook
,
err
:=
rotatelogs
.
New
(
//
没有使用
go
风格反人类的
format
格式
output_dir
+
filename
+
".%Y%m%d"
,
rotatelogs
.
WithLinkName
(
filename
),
rotatelogs
.
WithMaxAge
(
time
.
Hour
*
24
*
7
),
rotatelogs
.
WithRotationTime
(
time
.
Hour
*
24
),
)
if
err
!= nil {
panic
(
err
)
}
return
hook
}
~~~
## 使用
~~~
package
main
import
"tesou.io/platform/foot-parent/foot-api/common/base"
func
main
()
{
base
.
Log
.
Info
(
"日志1"
)
base
.
Log
.
Info
(
"日志2"
)
base
.
Log
.
Error
(
"错误的日志"
)
base
.
Log
.
Info
(
"日志3"
)
}
~~~
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录