@@ -311,18 +311,287 @@ applicationLogger.Close()
311311
312312// Open the logger with a new message queue size.
313313if err := applicationLogger.Open(100); err != nil {
314- panic(err)
314+ panic(err)
315315}
316316` ` `
317317
318318*Note: if you assign a new message queue size that is smaller than the number of messages sent to the queue, the logger
319319will add messages to the queue until it is not full, then it will wait (blocking the process) until the message from the
320320queue will be processed and free up the space in the message queue.*
321321
322- ## Class Diagram
322+ ### Reading Configuration from File
323+
324+ You could also read configuration from a file. Configuration file should be in one of the following formats: ` *.json` ,
325+ ` *.yaml` , ` *.xml` . Configuration file should contain the following fields:
326+
327+ ` ` ` text
328+ - Loggers (array of loggers)
329+ - Name (string)
330+ - Time Format (string)
331+ - Message Queue Size (int)
332+ - Handlers (array of handlers)
333+ - Type (string)
334+ - From Level (string)
335+ - To Level (string)
336+ - File (string)
337+ - Formatter (string)
338+ - Type (string)
339+ - Pretty Print (bool)
340+ - Pair Separator (string)
341+ - Key Value Delimiter (string)
342+ - Template (template)
343+ - String Value (string)
344+ - Map Value (map of string to string)
345+ ` ` `
323346
324- 
347+ Example of the configuration files:
348+
349+ - JSON
350+
351+ ` ` ` json
352+ {
353+ "loggers": [
354+ {
355+ "name": "example-logger",
356+ "time-format": "2006-01-02 15:04:05",
357+ "message-queue-size": 100,
358+ "handlers": [
359+ {
360+ "type": "stdout",
361+ "from-level": "all",
362+ "to-level": "severe",
363+ "formatter": {
364+ "type": "json",
365+ "pretty-print": false,
366+ "template": {
367+ "string": "%(datetime) - %(level) - %(message)",
368+ "map": {
369+ "timestamp": "%(datetime)",
370+ "level": "%(level)",
371+ "name": "%(name)"
372+ }
373+ }
374+ }
375+ },
376+ {
377+ "type": "stderr",
378+ "from-level": "error",
379+ "to-level": "null",
380+ "formatter": {
381+ "type": "key-value",
382+ "pair-separator": " ",
383+ "key-value-delimiter": ":",
384+ "template": {
385+ "string": "%(datetime) - %(level) - %(message)",
386+ "map": {
387+ "timestamp": "%(datetime)",
388+ "level": "%(level)",
389+ "name": "%(name)"
390+ }
391+ }
392+ }
393+ },
394+ {
395+ "type": "file",
396+ "from-level": "all",
397+ "to-level": "null",
398+ "file": "example.log",
399+ "formatter": {
400+ "type": "json",
401+ "pretty-print": true,
402+ "template": {
403+ "string": "%(datetime) - %(level) - %(message)",
404+ "map": {
405+ "timestamp": "%(datetime)",
406+ "level": "%(level)",
407+ "name": "%(name)"
408+ }
409+ }
410+ }
411+ }
412+ ]
413+ }
414+ ]
415+ }
416+ ` ` `
325417
326- ## Sequence Diagram - Create A New Logger
418+ - YAML
419+
420+ ` ` ` yaml
421+ loggers:
422+ - name: example-logger
423+ time-format: "2006-01-02 15:04:05"
424+ message-queue-size: 100
425+ handlers:
426+ - type: stdout
427+ from-level: all
428+ to-level: severe
429+ formatter:
430+ type: json
431+ pretty-print: false
432+ template:
433+ string: "%(datetime) - %(level) - %(message)"
434+ map:
435+ timestamp: "%(datetime)"
436+ level: "%(level)"
437+ name: "%(name)"
438+ - type: stderr
439+ from-level: error
440+ to-level: "null"
441+ formatter:
442+ type: key-value
443+ pair-separator: " "
444+ key-value-delimiter: ":"
445+ template:
446+ string: "%(datetime) - %(level) - %(message)"
447+ map:
448+ timestamp: "%(datetime)"
449+ level: "%(level)"
450+ name: "%(name)"
451+ - type: file
452+ from-level: all
453+ to-level: "null"
454+ file: example.log
455+ formatter:
456+ type: json
457+ pretty-print: true
458+ template:
459+ string: "%(datetime) - %(level) - %(message)"
460+ map:
461+ timestamp: "%(datetime)"
462+ level: "%(level)"
463+ name: "%(name)"
464+ ` ` `
465+
466+ - XML
467+
468+ ` ` ` xml
469+ <root>
470+ <loggers>
471+ <logger>
472+ <name>example-logger</name>
473+ <time-format>2006-01-02 15:04:05</time-format>
474+ <message-queue-size>100</message-queue-size>
475+ <handlers>
476+ <handler>
477+ <type>stdout</type>
478+ <from-level>all</from-level>
479+ <to-level>severe</to-level>
480+ <formatter>
481+ <type>json</type>
482+ <pretty-print>false</pretty-print>
483+ <template>
484+ <string>%(datetime) - %(level) - %(message)</string>
485+ <map>
486+ <timestamp>%(datetime)</timestamp>
487+ <level>%(level)</level>
488+ <name>%(name)</name>
489+ </map>
490+ </template>
491+ </formatter>
492+ </handler>
493+ <handler>
494+ <type>stderr</type>
495+ <from-level>error</from-level>
496+ <to-level>null</to-level>
497+ <formatter>
498+ <type>key-value</type>
499+ <pair-separator> </pair-separator>
500+ <key-value-delimiter>:</key-value-delimiter>
501+ <template>
502+ <string>%(datetime) - %(level) - %(message)</string>
503+ <map>
504+ <timestamp>%(datetime)</timestamp>
505+ <level>%(level)</level>
506+ <name>%(name)</name>
507+ </map>
508+ </template>
509+ </formatter>
510+ </handler>
511+ <handler>
512+ <type>file</type>
513+ <from-level>all</from-level>
514+ <to-level>null</to-level>
515+ <file>example.log</file>
516+ <formatter>
517+ <type>json</type>
518+ <pretty-print>true</pretty-print>
519+ <template>
520+ <string>%(datetime) - %(level) - %(message)</string>
521+ <map>
522+ <timestamp>%(datetime)</timestamp>
523+ <level>%(level)</level>
524+ <name>%(name)</name>
525+ </map>
526+ </template>
527+ </formatter>
528+ </handler>
529+ </handlers>
530+ </logger>
531+ </loggers>
532+ </root>
533+ ` ` `
534+
535+ To create a logger from the configuration file, you need to:
536+
537+ 1 . Create a new Parser with the Configuration object. You shall use parser from the ` logger` or ` structuredlogger` .
538+ 1 . Create a new Configuration object manually and initialize parser with it.
539+ 1 . Parse configuration file to receive the Configuration . You could do this by calling the ` ReadFromJSON` ,
540+ ` ReadFromYAML` , ` ReadFromXML` methods respectively, it will return the Configuration object.
541+
542+ ` ` ` go
543+ // Parse configuration from JSON file.
544+ newConfiguration, err := parser.ReadFromJSON("path/to/configuration/file.json")
545+ if err != nil {
546+ panic(err)
547+ }
548+
549+ // Parse configuration from YAML file.
550+ newConfiguration, err := parser.ReadFromYAML("path/to/configuration/file.yaml")
551+ if err != nil {
552+ panic(err)
553+ }
554+
555+ // Parse configuration from XML file.
556+ newConfiguration, err := parser.ReadFromXML("path/to/configuration/file.xml")
557+ if err != nil {
558+ panic(err)
559+ }
560+ ` ` `
561+ 2 . Create a new Parser with the Configuration object. You shall use parser from the ` logger` or ` structuredlogger`
562+ packages respectively, depending on which one you need.
563+
564+ ` ` ` go
565+ newParser := parser.NewParser(newConfiguration)
566+ ` ` `
567+ 2 . Create Parser from the configuration file directly.
327568
328- 
569+ ` ` ` go
570+ // Create a new Parser from JSON configuration file.
571+ newParser, err := parser.ParseJSON("path/to/configuration/file.json")
572+ if err != nil {
573+ panic(err)
574+ }
575+
576+ // Create a new Parser from YAML configuration file.
577+ newParser, err := parser.ParseYAML("path/to/configuration/file.yaml")
578+ if err != nil {
579+ panic(err)
580+ }
581+
582+ // Create a new Parser from XML configuration file.
583+ newParser, err := parser.ParseXML("path/to/configuration/file.xml")
584+ if err != nil {
585+ panic(err)
586+ }
587+ ` ` `
588+
589+ 2 . Get a logger from the Parser .
590+
591+ ` ` ` go
592+ // Standard Logger
593+ newLogger := newParser.GetLogger("example-logger")
594+
595+ // Async Logger
596+ newLogger := newParser.GetAsyncLogger("example-logger")
597+ ` ` `
0 commit comments