造轮子有啥用啊?
轮子造的好就能反复使用啊,你才有更多时间造轮子啊。雪球也不是一天能滚大的吗!
扒一扒这些日志的轮子:
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