Log4J

Log4j is a popular logging library for Java and is widely used in Java-based applications. It is famous for several reasons, including its ability to output logs in various formats, its support for customizable log levels, and its ability to integrate with other logging frameworks.

It started as a logging tool for Java, which eventually became a de facto standard in the industry.

Rust developers wrote a wrapper around those .jar files and made it available for Rust also.

https://github.com/Better-Player/log4j-rs

Several tools can be used to view the Logs generated by log4j.

LogViewPlus https://www.logviewplus.com/log-viewer.html

Another one https://www.xplg.com/log4j-viewer-analyzer/

Apart from this, there are a lot of Big Data Real-time log viewers, such as

Splunk

Logstash

-------

Appenders route log messages to different destinations, such as a log file, the console, or a network socket.

// cargo.toml

[dependencies]
log="0.4.17"
log4rs = "1.2.0"
// main.rs

use log::{error,info,warn,trace,debug, LevelFilter, SetLoggerError};
use log4rs::{
	append::{
		console::{ConsoleAppender},
		file::FileAppender,		
	},
	config::{Appender, Root,Config,Logger},
	encode::pattern::PatternEncoder,
    encode::json::JsonEncoder,
};

fn main() -> Result<(), SetLoggerError>  {

    // https://docs.rs/log4rs/latest/log4rs/encode/pattern/
    let stdout = ConsoleAppender::builder()
                    //.encoder(Box::new(JsonEncoder::new()))
                    .encoder(Box::new(PatternEncoder::new("{d} {h({l})} - {f} Line:{L} - {t} - {m}{n}")))
                    .build();

    let tofile = FileAppender::builder()
                    .encoder(Box::new(PatternEncoder::new("{d} {h({l})} - {f} Line:{L} - {t} - {m}{n}")))
                    .encoder(Box::new(JsonEncoder::new()))
                    .build("log/requests.log")
                    .unwrap();

    let config = Config::builder()
                    .appender(Appender::builder().build("stdout", Box::new(stdout)))
                    .appender(Appender::builder().build("save_to_file", Box::new(tofile)))
                    
                    .logger(Logger::builder()
                        .appender("save_to_file")
                        .additive(false)
                        .build("requests", LevelFilter::Warn))

                    .logger(Logger::builder()
                        .appender("stdout")
                        .additive(false)
                        .build("stdout", LevelFilter::Warn))

                    .build(
                        Root::builder()
                            .appender("stdout")
                            .appender("save_to_file")
                            .build(LevelFilter::Trace)
                        )
                    .unwrap();

    let _handle = log4rs::init_config(config).unwrap();

    //

    info!("Just FYI");
    error!("Used when reporting errors / panic situations.");
    warn!("Non Critical messages");
    debug!("Use this when debugging scripts");
    trace!("This is also used when debugging scripts. The difference is the granularity trace offers.");

    Ok(())
}