异步打印日志类的实现

需求:实现一个类,要求这个类能实现日志的异步打印,打印信息包含时间,文件名,行号,进程号以及用户的打印信息。

这个需求里面的技术点。
1.异步的实现,肯定需要利用到线程?怎么保证线程同步?
2.文件名行号的获取?
3.怎么实现类似于printf的格式化输出的效果?

第一个问题:实现异步写日志
利用stl标准库里面的std::thread,结合std::mutex(共享锁)和std::condition_variable(条件变量)来实现。
另外这个类里面需要定义一个list类,list于vector类似,但是实现是基于双向链表的。在工作线程中,我们只需要将需要打印的string类加入到类Log的list链表内,同时notify_one()唤醒一次工作线程即可(该函数与notify_all()功能类似,都是用来唤醒线程),这里唤醒一次,处理一次队列里面的内容,然后线程休眠,阻塞在wait处。

多线程相关建议使用C++11的stl标准库。
对应的类是std::thread类,构造方法是std::thread(function,arg…);
相关的辅助类方法有
std::thread.join() //等待thread执行,再返回调用线程执行
std::thread.detatch() //线程分离
std::thread.joinable() //判断线程是否可以join
std::thread.get_id() //获取线程id
yield(); //当前线程放弃执行

在多线程调用时,需要用到锁。比如对类中的待打印队列进行操作时,如果不加锁,就很可能出现多个线程同时对类的打印队列进行操作。
最初始的mutex锁使用方法比较简单,如下

mutex m;
void func()
{
   
   
	m.lock();
	//do something
	m.unlock();
}

以前的这种形式在很多时候容易出现忘记解锁的情况,导致出现死锁。
所以新的版本又出现了lock_guard,这个可以不用用户手动解锁,构造一个类,在出作用域的时候会直接调用析构函数帮用户解锁,避免出现死锁的情况。

mutex m;
void func()
{
   
   
	std::lock_guard<mutex > mylock(m); //这里在构造的时候就已经上锁了
	//dosomething
	//函数结束时自动调用mylock的析构函数释放锁
}

lock_guard也可以通过传入两个参数来手动上锁,另外声明的lock_guard是不能手动加锁解锁的。
后面又引入了一个新的类unique_lock,他是lock_guard的升级版,用法更加丰富,可以通过构造参

所给引用内容未提及JavaFX使用异步Logger实现异步打印日志的相关信息。不过可以结合已知的Logback异步日志记录特性来推测实现思路。 Logback是一个灵活且高性能的日志框架,支持异步日志记录 [^1]。在JavaFX项目中若要使用异步Logger实现异步打印日志,可先确保项目中引入了Logback依赖。 以下是一个简单示例,假设项目使用Maven管理依赖,在`pom.xml`中添加Logback依赖: ```xml <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> ``` 接着配置Logback的`logback.xml`文件以启用异步日志记录: ```xml <configuration> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <appender-ref ref="FILE"/> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>logs/application.log</file> <encoder> <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="ASYNC"/> </root> </configuration> ``` 在JavaFX代码中使用异步Logger打印日志: ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.VBox; import javafx.stage.Stage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class JavaFXAsyncLoggingExample extends Application { private static final Logger logger = LoggerFactory.getLogger(JavaFXAsyncLoggingExample.class); @Override public void start(Stage primaryStage) { Label label = new Label("JavaFX Async Logging Example"); VBox vbox = new VBox(label); Scene scene = new Scene(vbox, 300, 200); primaryStage.setTitle("JavaFX Async Logging"); primaryStage.setScene(scene); primaryStage.show(); // 异步打印日志 logger.info("JavaFX application started"); } public static void main(String[] args) { launch(args); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值