trillium-logger 0.4.5

logger for trillium.rs
Documentation
use access_log_parser::{parse, LogEntry, LogType, RequestResult};
use std::sync::{Arc, Mutex};
use time::OffsetDateTime;
use trillium::{
    KnownHeaderName::{Referer, UserAgent},
    Version,
};
use trillium_logger::{apache_combined, apache_common, logger, ColorMode};
use trillium_testing::prelude::*;

async fn teapot(conn: trillium::Conn) -> trillium::Conn {
    conn.with_status(Status::ImATeapot).with_body("ok")
}

#[test]
fn test_apache_combined() {
    let s = Arc::new(Mutex::new(String::new()));
    let logger = logger()
        .with_formatter(apache_combined("request-id", "user"))
        .with_target({
            let s = s.clone();
            move |line: String| s.lock().unwrap().push_str(&line)
        })
        .with_color_mode(ColorMode::Off);

    let ip = "1.2.3.4".parse().unwrap();
    let handler = (logger, teapot);
    get("/some/path?query")
        .with_peer_ip(ip)
        .with_request_header(Referer, "http://example.com")
        .with_request_header(UserAgent, "secret agent")
        .on(&handler);
    let s = s.lock().unwrap();
    let Ok(LogEntry::CombinedLog(log)) = parse(LogType::CombinedLog, &s) else {
        panic!()
    };
    let RequestResult::Valid(request) = log.request else {
        panic!()
    };
    assert_eq!(log.ip, ip);
    assert!(OffsetDateTime::now_utc().unix_timestamp() - log.timestamp.timestamp() < 2);
    assert_eq!(request.uri(), "/some/path?query");
    assert_eq!(request.method(), "GET");
    assert_eq!(log.status_code, Status::ImATeapot);
    assert_eq!(request.version(), Version::Http1_1);
    assert_eq!(log.identd_user, Some("request-id"));
    assert_eq!(log.user, Some("user"));
    assert_eq!(log.referrer, Some("http://example.com".parse().unwrap()));
    assert_eq!(log.user_agent, Some("secret agent"));
}

#[test]
fn test_apache_common() {
    let s = Arc::new(Mutex::new(String::new()));
    let logger = logger()
        .with_formatter(apache_common("request-id", "user"))
        .with_target({
            let s = s.clone();
            move |line: String| s.lock().unwrap().push_str(&line)
        })
        .with_color_mode(ColorMode::Off);

    let ip = "1.2.3.4".parse().unwrap();
    let handler = (logger, teapot);
    get("/some/path?query")
        .with_peer_ip(ip)
        .with_request_header(Referer, "http://example.com")
        .with_request_header(UserAgent, "secret agent")
        .on(&handler);
    let s = s.lock().unwrap();
    let Ok(LogEntry::CommonLog(log)) = parse(LogType::CommonLog, &s) else {
        panic!()
    };
    let RequestResult::Valid(request) = log.request else {
        panic!()
    };
    assert!(OffsetDateTime::now_utc().unix_timestamp() - log.timestamp.timestamp() < 2);
    assert_eq!(log.ip, ip);
    assert_eq!(request.uri(), "/some/path?query");
    assert_eq!(request.method(), "GET");
    assert_eq!(log.status_code, Status::ImATeapot);
    assert_eq!(request.version(), Version::Http1_1);
    assert_eq!(log.identd_user, Some("request-id"));
    assert_eq!(log.user, Some("user"));
}