解决使用Java logging文件记录日志过程中产生.lck文件和重复文件的问题

问题描述

    在使用Java logging的过程中,产生了许多.lck文件和带着后缀的重复文件。尝试使用记事本打开这两种文件,.lck文件为空,不同的重复文件中记录的是一条或者几条不同的log信息。而需求是要将这些所有的log信息记录到一个文件中。


.lck文件的作用

    名副其实,lck是lock的缩写。这类文件其实之前我们也接触过,不过大都没有注意而已。比如说使用VMware虚拟机运行Linux系统过程中,虚拟机对应的文件夹就会产生一个.lck文件,当虚拟机关闭相应的文件也会自动删除。但是如果虚拟机异常关闭.lck文件保留的情况下,再运行这个虚拟机将会遇到类似虚拟机不存在的错误(曾经遇到过)。说到这里其实也能对它的作用做一些基本的判断了。.lck文件就是对文件的一种锁定方式,当文件处于被访问状态时,一部分处理机制就是生成.lck文件防止其他进程的读取。当对着个文件访问的进程正常结束时,该文件自动删除,保持可访问状态。

问题的处理方法

    将lck文件全部删除,发现lck文件生成在程序运行阶段,但是关闭了以后并没被删除,手动删除以后再次运行,发现需要写入的log写入到了正确的文件中而不是另外生成一个带后缀的重名文件。考虑到是使用FileHandler过程中未调用close()方法来结束进程,于是在代码末尾添加了close()方法,发现仍会出现相同的问题,但是生成的重名文件变少了几个。问题没有解决,但是方向和思路应该就在这里。

    然后我检查了我所有的代码,定义过FileHandler的地方

### 解决HBase SLF4J StaticLoggerBinder Failed to Load Class 的方法 当遇到 `SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder"` 错误时,通常是因为日志框架的绑定库缺失或冲突引起的。以下是针对该问题的具体解决方案: #### 1. 配置环境变量 确保在 `/opt/hbase/hbase-2.0.2/conf` 路径下的 `hbase-env.sh` 文件中已正确设置必要的环境变量[^1]。这些变量包括但不限于以下内容: ```bash export JAVA_HOME=/opt/java/jdk1.8.0_181 export HADOOP_HOME=/opt/hadoop/hadoop-2.7.2 export HBASE_HOME=/opt/HBase/hbase-2.0.2 export HBASE_CLASSPATH=/opt/hadoop/hadoop-2.7.2/etc/hadoop export HBASE_PID_DIR=/root/hbase/pids export HBASE_MANAGES_ZK=false ``` 上述配置可以确保 HBase 正确识别依赖路径并加载所需的类。 --- #### 2. 添加 SLF4J 绑定库 为了修复 `StaticLoggerBinder` 加载失败的问题,需确认 HBase 所使用的 JAR 包目录下存在合适的 SLF4J 实现库。常见的实现有 Logback 或 Log4j。可以通过以下方式解决问题: ##### 方法一:引入 Logback 实现 下载最新版本的 Logback 库(例如 logback-classic logback-core),并将它们放置于 `$HBASE_HOME/lib` 目录下。具体命令如下: ```bash wget https://repo1.maven.org/maven2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar wget https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar mv logback*.jar $HBASE_HOME/lib/ ``` ##### 方法二:引入 Log4j 实现 如果更倾向于使用 Log4j,则需要添加对应的 SLF4J Bridge Log4j Core 库: ```bash wget https://repo1.maven.org/maven2/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30.jar wget https://repo1.maven.org/maven2/log4j/log4j/1.2.17/log4j-1.2.17.jar mv slf4j-log4j12*.jar log4j*.jar $HBASE_HOME/lib/ ``` 无论采用哪种方法,请务必删除可能存在的其他不兼容的日志实现库(如多个不同版本的 SLF4J Binders)。这一步骤可通过运行以下命令完成: ```bash find $HBASE_HOME/lib -name "*slf4j*" | grep binder rm -rf $(find $HBASE_HOME/lib -name "*binder*") ``` --- #### 3. 检查 CLASSPATH 设置 验证 `$HBASE_CLASSPATH` 是否包含了所有必需的依赖项。如果没有显式指定,可能会导致某些类无法被加载。可以在启动脚本中手动追加相关路径,或者通过修改 `hbase-env.sh` 来扩展默认的 CLASSPATH 值。 --- #### 4. 启动前清理缓存 有时旧版的临时文件可能导致异常行为。建议重启服务之前清除掉任何残留数据: ```bash rm -rf /tmp/*.lck ``` --- ### 总结 以上措施能够有效解决因缺少适当 SLF4J Binding 导致的日志初始化错误。最终目标是让 HBase 成功找到唯一的 Logger Implementation 并正常工作。 ```python # 示例 Python 日志配置代码片段 (仅作参考) import logging from logging.handlers import RotatingFileHandler logger = logging.getLogger(__name__) handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=5) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.DEBUG) logger.info("Logging system initialized.") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值