对比log包的使用

造轮子有啥用啊?

轮子造的好就能反复使用啊,你才有更多时间造轮子啊。雪球也不是一天能滚大的吗!

扒一扒这些日志的轮子:

python中log日志的使用
定制自己的日志功能:

def get_logger(path=os.getcwd()):
    logger = logging.getLogger('mylogger')
    logger.setLevel(logging.DEBUG)
    if not os.path.exists(f"{path}/log"):
        os.mkdir(f"{path}/log")
    // 设置日志回滚以及日常问题日志输出的文件
    # rf_handler = logging.FileHandler(os.path.join(path, 'log/run.log'), encoding="utf-8")
    rf_handler = logging.handlers.TimedRotatingFileHandler(os.path.join(path, 'log/run.log'), when='midnight',
                                                           interval=1, backupCount=7, atTime=datetime.time(0, 0, 0, 0),
                                                           encoding="utf-8", delay=True)
    rf_handler.setLevel(logging.INFO)
    rf_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))

    // 设置错误日志输出的文件
    f_handler = logging.FileHandler(os.path.join(path, 'log/error.log'), encoding="utf-8")
    f_handler.setLevel(logging.ERROR)
    f_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"))

    logger.addHandler(rf_handler)
    logger.addHandler(f_handler)

    return logger

用法:

# 定制日志输出文件在调用log包的程序的文件夹内
# 而不是程序主入口位置
# 这样可以分隔不同位置的日志
file_path, file_name = os.path.split(os.path.abspath(__file__))
logger = get_logger(file_path)
logger.info("***")
logger.error("***")

golang中定制化日志:

package main

import (
	"io"
	"io/ioutil"
	"log"
	"os"
)

var (
	Trace *log.Logger
	Info *log.Logger
	Warning *log.Logger
	Error *log.Logger
)

func init() {
	file, err := os.OpenFile("errors.txt", os.O_CREATE | os.O_WRONLY | os.O_APPEND, 0666)
	if err != nil {
		log.Fatalln("Failed to open error log file:", err)
	}
	Trace = log.New(ioutil.Discard, "TRACE: ", log.Ldate | log.Ltime | log.Llongfile)
	Info = log.New(os.Stdout, "INFO: ", log.Ldate | log.Ltime | log.Llongfile)
	Warning = log.New(os.Stdout, "WARNING: ", log.Ldate | log.Ltime | log.Llongfile)
	Error = log.New(io.MultiWriter(file, os.Stderr), "ERROR: ", log.Ldate | log.Ltime | log.Llongfile)
}

func main() {
	Trace.Println("I have something standard to say")
	Info.Println("Special Information")
	Warning.Println("There is something you need to know about")
	Error.Println("Something has failed")
}

对比:

  • golang的日志处理看起来更加的成熟和简单,简单的配置就达到想要的目的。
  • golang的日志记录器是多 goroutine 安全的。这意味着在多个 goroutine 可以同时调用来自同一个日志记录器的这些函数,而不会有彼此间的写冲突。[这一点上比python好很多,python的logging包只能保证一个线程的写入]
  • golang的日志归档需要借助第三方包。
  • python的日志归档在多线程场景下总会有线程占用的问题。

看起来还是golang的日志管理比较成熟啊,毕竟是吸取很多经验才造的轮子,是后起之秀啊。

golang日志归档的参考博客:
https://www.cnblogs.com/flippedxyy/p/15558769.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值