1- use std:: cmp;
1+ //! OpenSearch specific log configuration
2+
3+ use std:: { cmp, collections:: BTreeMap } ;
24
35use stackable_operator:: {
46 memory:: { BinaryMultiple , MemoryQuantity } ,
5- product_logging:: spec:: AutomaticContainerLogConfig ,
7+ product_logging:: spec:: { AppenderConfig , AutomaticContainerLogConfig , LogLevel , LoggerConfig } ,
68} ;
79
8- use crate :: { crd:: v1alpha1, framework:: product_logging:: framework:: STACKABLE_LOG_DIR } ;
10+ use crate :: {
11+ crd:: v1alpha1:: { self } ,
12+ framework:: {
13+ builder:: pod:: container:: { EnvVarName , EnvVarSet } ,
14+ product_logging:: framework:: STACKABLE_LOG_DIR ,
15+ } ,
16+ } ;
917
10- /// The log configuration file
18+ /// OpenSearch log configuration file
1119pub const CONFIGURATION_FILE_LOG4J2_PROPERTIES : & str = "log4j2.properties" ;
1220
1321const OPENSEARCH_SERVER_LOG_FILE : & str = "opensearch_server.json" ;
@@ -17,24 +25,39 @@ pub const MAX_OPENSEARCH_SERVER_LOG_FILES_SIZE: MemoryQuantity = MemoryQuantity
1725 unit : BinaryMultiple :: Mebi ,
1826} ;
1927
28+ /// Create a log4j2 configuration from the given automatic log configuration
2029pub fn create_log4j2_config ( config : & AutomaticContainerLogConfig ) -> String {
21- let log_path = format ! (
22- "{STACKABLE_LOG_DIR}/{container}/{OPENSEARCH_SERVER_LOG_FILE}" ,
23- container = v1alpha1:: Container :: OpenSearch . to_container_name( )
24- ) ;
30+ [
31+ log4j2_root_logger_config ( & config. root_log_level ( ) ) ,
32+ log4j2_loggers_config ( & config. loggers ) ,
33+ log4j2_console_appender_config ( & config. console ) ,
34+ log4j2_file_appender_config ( & config. file ) ,
35+ ]
36+ . iter ( )
37+ . flatten ( )
38+ . map ( |( key, value) | format ! ( "{key} = {value}\n " ) )
39+ . collect ( )
40+ }
2541
26- let number_of_archived_log_files = 1 ;
27- let max_log_files_size_in_mib = MAX_OPENSEARCH_SERVER_LOG_FILES_SIZE
28- . scale_to ( BinaryMultiple :: Mebi )
29- . floor ( )
30- . value as u32 ;
31- let max_log_file_size_in_mib = cmp:: max (
32- 1 ,
33- max_log_files_size_in_mib / ( 1 + number_of_archived_log_files) ,
34- ) ;
42+ fn log4j2_root_logger_config ( root_log_level : & LogLevel ) -> Vec < ( String , String ) > {
43+ vec ! [
44+ (
45+ "rootLogger.level" . to_owned( ) ,
46+ root_log_level. to_log4j2_literal( ) ,
47+ ) ,
48+ (
49+ "rootLogger.appenderRef.CONSOLE.ref" . to_owned( ) ,
50+ "CONSOLE" . to_owned( ) ,
51+ ) ,
52+ (
53+ "rootLogger.appenderRef.FILE.ref" . to_owned( ) ,
54+ "FILE" . to_owned( ) ,
55+ ) ,
56+ ]
57+ }
3558
36- let loggers = config
37- . loggers
59+ fn log4j2_loggers_config ( loggers_config : & BTreeMap < String , LoggerConfig > ) -> Vec < ( String , String ) > {
60+ loggers_config
3861 . iter ( )
3962 . filter ( |( name, _) | name. as_str ( ) != AutomaticContainerLogConfig :: ROOT_LOGGER )
4063 . enumerate ( )
@@ -50,24 +73,13 @@ pub fn create_log4j2_config(config: &AutomaticContainerLogConfig) -> String {
5073 ) ,
5174 ]
5275 } )
53- . collect :: < Vec < _ > > ( ) ;
54-
55- let root_logger = vec ! [
56- (
57- "rootLogger.level" . to_owned( ) ,
58- config. root_log_level( ) . to_log4j2_literal( ) ,
59- ) ,
60- (
61- "rootLogger.appenderRef.CONSOLE.ref" . to_owned( ) ,
62- "CONSOLE" . to_owned( ) ,
63- ) ,
64- (
65- "rootLogger.appenderRef.FILE.ref" . to_owned( ) ,
66- "FILE" . to_owned( ) ,
67- ) ,
68- ] ;
76+ . collect :: < Vec < _ > > ( )
77+ }
6978
70- let console_appender = vec ! [
79+ fn log4j2_console_appender_config (
80+ console_appender_config : & Option < AppenderConfig > ,
81+ ) -> Vec < ( String , String ) > {
82+ vec ! [
7183 ( "appender.CONSOLE.type" . to_owned( ) , "Console" . to_owned( ) ) ,
7284 ( "appender.CONSOLE.name" . to_owned( ) , "CONSOLE" . to_owned( ) ) ,
7385 (
@@ -90,16 +102,34 @@ pub fn create_log4j2_config(config: &AutomaticContainerLogConfig) -> String {
90102 ) ,
91103 (
92104 "appender.CONSOLE.filter.threshold.level" . to_owned( ) ,
93- config
94- . console
105+ console_appender_config
95106 . as_ref( )
96107 . and_then( |console| console. level)
97108 . unwrap_or_default( )
98109 . to_log4j2_literal( ) ,
99110 ) ,
100- ] ;
111+ ]
112+ }
113+
114+ fn log4j2_file_appender_config (
115+ file_appender_config : & Option < AppenderConfig > ,
116+ ) -> Vec < ( String , String ) > {
117+ let log_path = format ! (
118+ "{STACKABLE_LOG_DIR}/{container}/{OPENSEARCH_SERVER_LOG_FILE}" ,
119+ container = v1alpha1:: Container :: OpenSearch . to_container_name( )
120+ ) ;
121+
122+ let number_of_archived_log_files = 1 ;
123+ let max_log_files_size_in_mib = MAX_OPENSEARCH_SERVER_LOG_FILES_SIZE
124+ . scale_to ( BinaryMultiple :: Mebi )
125+ . floor ( )
126+ . value as u32 ;
127+ let max_log_file_size_in_mib = cmp:: max (
128+ 1 ,
129+ max_log_files_size_in_mib / ( 1 + number_of_archived_log_files) ,
130+ ) ;
101131
102- let file_appender = vec ! [
132+ vec ! [
103133 ( "appender.FILE.type" . to_owned( ) , "RollingFile" . to_owned( ) ) ,
104134 ( "appender.FILE.name" . to_owned( ) , "FILE" . to_owned( ) ) ,
105135 ( "appender.FILE.fileName" . to_owned( ) , log_path. to_owned( ) ) ,
@@ -141,33 +171,38 @@ pub fn create_log4j2_config(config: &AutomaticContainerLogConfig) -> String {
141171 ) ,
142172 (
143173 "appender.FILE.filter.threshold.level" . to_owned( ) ,
144- config
145- . file
174+ file_appender_config
146175 . as_ref( )
147176 . and_then( |file| file. level)
148177 . unwrap_or_default( )
149178 . to_log4j2_literal( ) ,
150179 ) ,
151- ] ;
152-
153- [ root_logger, loggers, console_appender, file_appender]
154- . iter ( )
155- . flatten ( )
156- . map ( |( key, value) | format ! ( "{key} = {value}\n " ) )
157- . collect ( )
180+ ]
158181}
159182
183+ /// Returns the Vector configuration file content as YAML
160184pub fn vector_config_file_content ( ) -> String {
161185 include_str ! ( "vector.yaml" ) . to_owned ( )
162186}
163187
188+ /// Returns the OpenSearch specific environment variables used in the Vector configuration file
189+ ///
190+ /// The common environment variables are already set in
191+ /// [`crate::framework::product_logging::framework::vector_container`].
192+ pub fn vector_config_file_extra_env_vars ( ) -> EnvVarSet {
193+ EnvVarSet :: new ( ) . with_value (
194+ & EnvVarName :: from_str_unsafe ( "OPENSEARCH_SERVER_LOG_FILE" ) ,
195+ "opensearch_server.json" ,
196+ )
197+ }
198+
164199#[ cfg( test) ]
165200mod tests {
166201 use stackable_operator:: product_logging:: spec:: {
167202 AppenderConfig , AutomaticContainerLogConfig , LogLevel , LoggerConfig ,
168203 } ;
169204
170- use super :: create_log4j2_config;
205+ use super :: { create_log4j2_config, vector_config_file_extra_env_vars } ;
171206
172207 #[ test]
173208 pub fn test_create_log4j2_config ( ) {
@@ -227,4 +262,10 @@ mod tests {
227262
228263 assert_eq ! ( expected_config, log4j2_config) ;
229264 }
265+
266+ #[ test]
267+ pub fn test_vector_config_file_extra_env_vars ( ) {
268+ // Test that the function does not panic
269+ vector_config_file_extra_env_vars ( ) ;
270+ }
230271}
0 commit comments