最新要闻
- 【新视野】GPT已长出眼睛耳朵 周鸿祎:人工智能将会产生意识
- 看点:苏州天使母基金合作子基金接连完成投资
- 曹德旺谈人工智能:能做饭吃吗?如果大家都去研究会饿死
- 当前看点!南方新一轮强降雨将上线!北方大部气温“狂飙” 最高飙到25度
- 今日观点!12款随便挑 太平鸟印花T恤清仓:到手69元
- 全球观热点:苹果WWDC 2023日期曝光!iOS 17首秀来了:或不再支持iPhone X/8
- 广东突降冰雹 多车被砸毁容!保险给赔吗?
- 事关出生证明、免税购物、高铁新路线!4月一大波新规来了
- 精选!AMD新一代APU曝光:大小核架构终于上了
- 动态:我国首次实现固态氢能发电并网,“绿电”与“绿氢”灵活转换
- 易烊千玺代言!九号电动两轮车国内出货突破150万辆
- 转型电动化 韩系车在中国还有救吗?
- 老人故意推倒摩托车案胜诉 老人儿子需赔1.6万!车主回应
- 速讯:孤芳自赏是哪一期蒙面唱将
- 【全球热闻】“韩国宾利”能拿下中国人吗?
- 焦点观察:票房破40亿中国影史第10!《流浪地球2》4月14日上线咪咕视频
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
当前观察:logback的使用和原理
(资料图片)
logback的使用和原理
1 依赖关系
在pom文件中引入springboot starter依赖,自动引入了这三个依赖,而这三个依赖,就是logback日志框架进行日志操作的。
org.springframework.boot spring-boot-starter
可以看到,logback-classic依赖于logback-core和slf4j-api。
2 执行流程
当我们在一个类中,使用 LoggerFactory.getLogger(xxx.class)
获取一个类的 Logger
对象时,发生了什么事,是在什么时候加载的logback.xml文件中的配置的,这是本文要解决的问题。
package org.example;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.Date;import java.util.UUID;public class LogPathOnLinuxApp{ private static final Logger logger = LoggerFactory.getLogger(LogPathOnLinuxApp.class); public static void main(String[] args) { logger.info(new Date().toString() + "生成了 UUID: " + UUID.randomUUID()); }}
单独的 T 代表一个类型 ,而 Class
代表这个类型所对应的类, Class<?>表示类型不确定的类,Class<?extends A>表示类型不确定的类是A的子类
常见的调用方式,使用 LoggerFactory.getLogger(LogPathOnLinuxApp.class)
获取 Logger
对象,然后使用 logger.info()
使用日志框架,输出日志信息。
首先,从 LoggerFactory.getLogger
入手,他位于 org.slf4j
包中
LoggerFactory
类中,
// 1.1 使用时传入的class对象,调用的是这个方法public static Logger getLogger(Class> clazz) { // 1.2 调用上面的方法,传入一个String类型的class的名字,返回一个Logger对象,这个就是最终返回的Logger对象,ctrl+鼠标左键,点进去 Logger logger = getLogger(clazz.getName()); if (DETECT_LOGGER_NAME_MISMATCH) { Class> autoComputedCallingClass = Util.getCallingClass(); if (autoComputedCallingClass != null && nonMatchingClasses(clazz, autoComputedCallingClass)) { Util.report(String.format("Detected logger name mismatch. Given name: \"%s\"; computed name: \"%s\".", logger.getName(), autoComputedCallingClass.getName())); Util.report("See http://www.slf4j.org/codes.html#loggerNameMismatch for an explanation"); } }// 最终返回给调用者的logger return logger; }// 1.2 public static Logger getLogger(String name) { // 1.3 调用getILoggerFactory方法,返回一个ILoggerFactory对象,点进去 ILoggerFactory iLoggerFactory = getILoggerFactory(); // 最终返回iLoggerFactory.getLogger(name)的Logger对象 return iLoggerFactory.getLogger(name); }// 这是类中的静态变量,在类加载的时候初始化static final int UNINITIALIZED = 0; // 未初始化static final int ONGOING_INITIALIZATION = 1; // 正在初始化static final int FAILED_INITIALIZATION = 2; // 初始化失败static final int SUCCESSFUL_INITIALIZATION = 3; // 初始化成功static final int NOP_FALLBACK_INITIALIZATION = 4; // 无回退初始化static volatile int INITIALIZATION_STATE = 0; // 初始化状态// 1.3 public static ILoggerFactory getILoggerFactory() { // 如果未初始化,就进行初始化操作 if (INITIALIZATION_STATE == 0) { Class var0 = LoggerFactory.class; // 对LoggerFactory类加锁 synchronized(LoggerFactory.class) { // 如果未初始化,将状态设置为正在初始化,执行performInitialization() if (INITIALIZATION_STATE == 0) { INITIALIZATION_STATE = 1; // 执行初始化 performInitialization(); } } }// 判断初始化状态 switch (INITIALIZATION_STATE) { case 1: return SUBST_FACTORY; case 2: throw new IllegalStateException("org.slf4j.LoggerFactory in failed state. Original exception was thrown EARLIER. See also http://www.slf4j.org/codes.html#unsuccessfulInit"); // 如果初始化成功,返回 StaticLoggerBinder.getSingleton().getLoggerFactory(); case 3: // 1.4 看这个方法 getLoggerFactory return StaticLoggerBinder.getSingleton().getLoggerFactory(); case 4: return NOP_FALLBACK_FACTORY; default: throw new IllegalStateException("Unreachable code"); } }
StaticLoggerBinder
类中,
private static StaticLoggerBinder SINGLETON = new StaticLoggerBinder();private LoggerContext defaultLoggerContext = new LoggerContext();static { SINGLETON.init(); }void init() { try { try { // 自动配置,autoConfig 点进去 (new ContextInitializer(this.defaultLoggerContext)).autoConfig(); } catch (JoranException var2) { Util.report("Failed to auto configure default logger context", var2); } if (!StatusUtil.contextHasStatusListener(this.defaultLoggerContext)) { StatusPrinter.printInCaseOfErrorsOrWarnings(this.defaultLoggerContext); } this.contextSelectorBinder.init(this.defaultLoggerContext, KEY); this.initialized = true; } catch (Exception var3) { Util.report("Failed to instantiate [" + LoggerContext.class.getName() + "]", var3); } }
ContextInitializer
类中,
// 此处的静态常量,表示的是logback的配置文件名public static final String AUTOCONFIG_FILE = "logback.xml";public static final String TEST_AUTOCONFIG_FILE = "logback-test.xml";public static final String CONFIG_FILE_PROPERTY = "logback.configurationFile";final LoggerContext loggerContext;// public void autoConfig() throws JoranException { StatusListenerConfigHelper.installIfAsked(this.loggerContext); // 没有任何配置文件时url为null URL url = this.findURLOfDefaultConfigurationFile(true); if (url != null) { // 读取自定义的配置文件,logback.xml文件配置生效 this.configureByResource(url); } else { Configurator c = (Configurator)EnvUtil.loadFromServiceLoader(Configurator.class); if (c != null) { try { c.setContext(this.loggerContext); c.configure(this.loggerContext); } catch (Exception var4) { throw new LogbackException(String.format("Failed to initialize Configurator: %s using ServiceLoader", c != null ? c.getClass().getCanonicalName() : "null"), var4); } } else { // 这一段代码保证了,没有任何配置文件时,也可以进行基础的自动配置,进行日志输出 BasicConfigurator basicConfigurator = new BasicConfigurator(); basicConfigurator.setContext(this.loggerContext); basicConfigurator.configure(this.loggerContext); } } }
3 日志滚动配置
需要注意在linux下执行的路径问题
${LOG_PATH}/${PROJECT_NAME}/logs/LogsPathTest.log ${LOG_PATH}/${PROJECT_NAME}/logs/LogsPathTest.%d{yyyy-MM-dd}.%i.log.gz 15 2MB %date{yyyy-MM-dd HH:mm:ss}\t%level\t%logger{96}\t%msg%n INFO %date{yyyy-MM-dd HH:mm:ss}\t%level\t%logger{96}\t%msg%n INFO
关键词:
世界观点:.NET6+Quartz实现定时任务
当前观察:logback的使用和原理
【新视野】GPT已长出眼睛耳朵 周鸿祎:人工智能将会产生意识
环球看热讯:状态观测器(一)
看点:苏州天使母基金合作子基金接连完成投资
曹德旺谈人工智能:能做饭吃吗?如果大家都去研究会饿死
当前看点!南方新一轮强降雨将上线!北方大部气温“狂飙” 最高飙到25度
今日观点!12款随便挑 太平鸟印花T恤清仓:到手69元
全球观热点:苹果WWDC 2023日期曝光!iOS 17首秀来了:或不再支持iPhone X/8
广东突降冰雹 多车被砸毁容!保险给赔吗?
事关出生证明、免税购物、高铁新路线!4月一大波新规来了
精选!AMD新一代APU曝光:大小核架构终于上了
动态:我国首次实现固态氢能发电并网,“绿电”与“绿氢”灵活转换
易烊千玺代言!九号电动两轮车国内出货突破150万辆
转型电动化 韩系车在中国还有救吗?
老人故意推倒摩托车案胜诉 老人儿子需赔1.6万!车主回应
全球关注:读Java性能权威指南(第2版)笔记28_线程和同步性能中
速讯:孤芳自赏是哪一期蒙面唱将
【全球热闻】“韩国宾利”能拿下中国人吗?
焦点观察:票房破40亿中国影史第10!《流浪地球2》4月14日上线咪咕视频
焦点快看:叙利亚外交部谴责美国对叙发动敌对行动
使用 Linux dd 命令测试磁盘读写性能
国际短信平台接口调用的方法步骤,简单5步快速教程
全球信息:Java之大数加减乘除——构建类
张译包场张颂文的新电影《不止不休》!猫眼评分9.3分
世界快消息!2026年亚运会将不建设运动员村:为了削减开支
焦点资讯:3年来最盛大红毯叫停:邓超激动得像买票进场 胡歌刘亦菲杨幂同框梦回仙剑
当前速看:国内这些城市地标为地球熄灯一小时:有你认识的吗?
小米OPPO和vivo实现突破性跨越!微信聊天记录能互相迁移了
天天微资讯!武汉一小伙考研出分后失眠多日,医生支招制定减压计划
linux中conda虚拟环境使用(便于项目切换)、pip和conda换源
原来熊猫的笑声这么粗犷吗 网友直呼没想到:公鸭嗓笑的像反派
天天讯息:被马斯克16亿垄断的工艺 卡了下游企业的脖子
天天热点评!女孩穿汉服乘公交:颜值惊艳众人
环球视点!液体钙和钙片哪个更容易吸收(液体钙和钙片哪个更好吸收)
python 使用 kafka
世界观点:《暗黑4》与《暗黑3》角色截图对比:女性角色更逼真了
捐100亿建大学 曹德旺:我赚了很多钱但不贪婪 会还给社会
女子摔跤上牙磕进嘴唇1月后才发现 医生惊叹不已:网友直呼心太大
徕卡+双长焦史无前例!小米13 Ultra曝光
焦点信息:Vue——initState【十】
当前信息:国外短信平台收不到验证码,怎么解决?
今日快看!什么叫针灸师
全球热文:红心番石榴吃法?
130余年老字号 非遗工艺 吴裕泰特种级茉莉香毫100g装40元
热资讯!灵隐寺旁小溪中大量放生乌龟死亡被吐槽是伪善 放生已成产业链最高2000元一次
【独家焦点】干旱缓解 新疆最大湖泊变了:阿雅克库木湖30年面积扩大近7成
焦点速讯:WPF 入门基础
周鸿祎与库克共话科技未来:惟一被淘汰的是不会用GPT的人
天天观点:12小时保温保冷 朴原良品316不锈钢保温杯16.9元起
世界快讯:代码漏洞暴露用户支付信息 ChatGPT安全存隐患:官方致歉
世界速讯:聚焦险企负债成本管理 监管座谈会释放调整信号
AMD Yes!Zen4回归骨折价 12核锐龙9 7900到手2549元
学生党福音 Redmi小金刚Note 12 Turbo的NFC卡升级:两大功能合体
当前资讯!mp3格式转换器哪个好_mp3格式转换器
dotnet-csharp
焦点精选!C++ sizeof与strlen,并借此明晰内存对齐
女生靠摆地摊还清百万负债 还有人两周赚1万5、月入万元:摆摊真这么赚钱?
【天天速看料】周鸿祎:中国与GPT-4差距两三年 不存在难以逾越技术障碍
当前热文:Windows OpenGL ES 图像 GPUImageAmatorkaFilter
javascript的基础知识
小彭汽车向小鹏汽车道歉:盘点那些神级模仿的老年代步车
【速看料】《三体》动画今日正式完结!豆瓣评分仅3.8:半数一星差评
焦点关注:998的比亚迪秦PLUS DM-i多能跑?博主极端工况实测:合资还怎么打
当前关注:Office2019永久激活工具_Office2019激活工具神龙版v2023.2
天天快播:What is static and dynamic libraries
[白嫖系列] 白嫖一个永久免费的eu.org域名
速看:76人攻防俱佳夺冠有望,湖人防守第一进攻拉胯,勇士卫冕基本无望
全球新资讯:女子模仿网红穿搭遭对方粉丝网暴!法院判网红连续15天道歉、赔偿
男子喝红牛味道不对发现是累牛引热议:康帅傅、雷碧等山寨货为何层出不穷
资讯推荐:关于aws-s3-bucket-静态网站托管相关的查询-S3.Client.get_bucket_website(**kwargs)
天天速读:西班牙经济连续两年增速达5.5%
用4年不卡!Redmi Note 12 Turbo配置公布:16GB+1TB、5000mAh
环球今头条!男子抖音晒夜爬泰山到井盖下躲风 景区回应:核实后会处罚
【焦点热闻】YCSB工具原理重点内容解读(二)
CSS鼠标样式(cursor)总结(转载)
每日速看!因航班延误缺考复试 考研生崩溃大哭:对不起父母 对不起自己的努力
猪肉含量≥85% 一口全是肉:亚明猪肉烤肠29.9元2斤大促
越秀资本03月24日获深股通增持98.52万股
精选!宏基e1471g怎么样
热文:czide-CALLAN自制语言(python)
环球短讯!《安富莱嵌入式周报》第307期:开源智能制冷板,Keil MDK6发布时间,编程助手Github Copilot X,Matlab2023,高品质电容
英特尔联合创始人戈登·摩尔去世:享年94岁 “摩尔定律”提出者
天天热点!公司回应招聘前台要求身材 硬性要求臀围86腰围58:网友吐槽离谱
每日消息!学习 React 需要具备的 JavaScript 知识
全球观点:gs_probackup增量备份ptrack.cpp : 88
农事贵争时 物资“抢运”忙——黑龙江部分地区备春耕铁路运输见闻
环球观焦点:中国驻科威特大使馆发布斋月期间领事温馨提醒
妮维雅SPA级氨基酸洗面奶19.9元官方大促:原价87.9元
库克中国行:晒和黄龄合影、宣布苹果捐赠增加至1亿元支持教育事业
天天时讯:读Java性能权威指南(第2版)笔记27_线程和同步性能上
热资讯!蓝盘、紫盘、黑盘?2023年机械硬盘怎么买?
世界快看点丨《互联网广告管理办法》公布:弹出广告不能“一键关闭”最高可罚3万
今日精选:在 Ubuntu 和 Fedora 中设置 Python 开发环境
世界今日报丨网友修iPhone偶遇苹果CEO库克:让他在碎了的后盖上签了个名
90后情侣3年存100万裸辞飞荷兰 网友热议:有勇气活的很洒脱
信息:俄称打击乌军人员装备 乌称击退俄军进攻
环球短讯!12-指针02
全球今亮点!C++ 虚函数(virtual) 和纯虚函数(pure virtual) 的区别
40秒看天宇上演“星月神话”:被月亮星星浪漫到了 月牙慢慢掩盖金星