@@ -5,6 +5,12 @@ use super::SystemTomlError;
5
5
use crate :: cli:: LogConfigArgs ;
6
6
use std:: io:: IsTerminal ;
7
7
use 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 ;
8
14
9
15
/// Configures and enables logging taking into account flags, env variables and file config.
10
16
///
@@ -19,7 +25,8 @@ pub fn log_init(
19
25
flags : & LogConfigArgs ,
20
26
config_dir : & Utf8Path ,
21
27
) -> Result < ( ) , SystemTomlError > {
22
- let subscriber = tracing_subscriber:: fmt ( )
28
+ // General logging
29
+ let log_layer = tracing_subscriber:: fmt:: layer ( )
23
30
. with_writer ( std:: io:: stderr)
24
31
. with_ansi ( std:: io:: stderr ( ) . is_terminal ( ) )
25
32
. with_timer ( tracing_subscriber:: fmt:: time:: UtcTime :: rfc_3339 ( ) ) ;
@@ -28,22 +35,43 @@ pub fn log_init(
28
35
. log_level
29
36
. or ( flags. debug . then_some ( tracing:: Level :: DEBUG ) ) ;
30
37
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
39
44
. with_file ( true )
40
45
. 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 ( ) ;
47
75
48
76
Ok ( ( ) )
49
77
}
0 commit comments