@@ -5,6 +5,12 @@ use super::SystemTomlError;
55use crate :: cli:: LogConfigArgs ;
66use std:: io:: IsTerminal ;
77use std:: str:: FromStr ;
8+ use tracing:: metadata:: LevelFilter ;
9+ use tracing_appender:: rolling:: * ;
10+ use tracing_subscriber:: filter:: filter_fn;
11+ use tracing_subscriber:: layer:: SubscriberExt ;
12+ use tracing_subscriber:: util:: SubscriberInitExt ;
13+ use tracing_subscriber:: Layer ;
814
915/// Configures and enables logging taking into account flags, env variables and file config.
1016///
@@ -19,7 +25,8 @@ pub fn log_init(
1925 flags : & LogConfigArgs ,
2026 config_dir : & Utf8Path ,
2127) -> Result < ( ) , SystemTomlError > {
22- let subscriber = tracing_subscriber:: fmt ( )
28+ // General logging
29+ let log_layer = tracing_subscriber:: fmt:: layer ( )
2330 . with_writer ( std:: io:: stderr)
2431 . with_ansi ( std:: io:: stderr ( ) . is_terminal ( ) )
2532 . with_timer ( tracing_subscriber:: fmt:: time:: UtcTime :: rfc_3339 ( ) ) ;
@@ -28,22 +35,43 @@ pub fn log_init(
2835 . log_level
2936 . or ( flags. debug . then_some ( tracing:: Level :: DEBUG ) ) ;
3037
31- if let Some ( log_level) = log_level {
32- subscriber. with_max_level ( log_level) . init ( ) ;
33- return Ok ( ( ) ) ;
34- }
35-
36- if std:: env:: var ( "RUST_LOG" ) . is_ok ( ) {
37- subscriber
38- . with_env_filter ( tracing_subscriber:: EnvFilter :: from_default_env ( ) )
38+ let log_layer = if let Some ( log_level) = log_level {
39+ log_layer
40+ . with_filter ( LevelFilter :: from_level ( log_level) )
41+ . boxed ( )
42+ } else if std:: env:: var ( "RUST_LOG" ) . is_ok ( ) {
43+ log_layer
3944 . with_file ( true )
4045 . with_line_number ( true )
41- . init ( ) ;
42- return Ok ( ( ) ) ;
43- }
44-
45- let log_level = get_log_level ( sname, config_dir) ?;
46- subscriber. with_max_level ( log_level) . init ( ) ;
46+ . with_filter ( tracing_subscriber:: EnvFilter :: from_default_env ( ) )
47+ . boxed ( )
48+ } else {
49+ let log_level = get_log_level ( sname, config_dir) ?;
50+ log_layer
51+ . with_filter ( LevelFilter :: from_level ( log_level) )
52+ . boxed ( )
53+ } ;
54+
55+ // Audit journal
56+ let audit_appender = RollingFileAppender :: builder ( )
57+ . rotation ( Rotation :: DAILY )
58+ . filename_prefix ( "tedge.audit.log" )
59+ . max_log_files ( 7 ) ;
60+ let audit_layer = audit_appender
61+ . build ( "/var/log/tedge" )
62+ . ok ( )
63+ . map ( |audit_appender| {
64+ tracing_subscriber:: fmt:: layer ( )
65+ . with_writer ( audit_appender)
66+ . with_timer ( tracing_subscriber:: fmt:: time:: UtcTime :: rfc_3339 ( ) )
67+ . with_filter ( LevelFilter :: INFO )
68+ . with_filter ( filter_fn ( |metadata| metadata. target ( ) == "Audit" ) )
69+ } ) ;
70+
71+ tracing_subscriber:: registry ( )
72+ . with ( audit_layer)
73+ . with ( log_layer)
74+ . init ( ) ;
4775
4876 Ok ( ( ) )
4977}
0 commit comments