From 79d0b1cd09b6afc75359a1603bfd83a1ad053a83 Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Fri, 22 May 2020 22:57:11 -0500 Subject: [PATCH] Added rolling log support + Log files are limited to 10mb + 10 logs are kept at a time --- .gitignore | 1 + README.md | 4 +-- src/discord/events.rs | 8 +++-- src/main.rs | 75 ++++++++++++++++++++++++++++++++++--------- 4 files changed, 68 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 37c8717..20770a1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target **/*.rs.bk .env +log/* diff --git a/README.md b/README.md index 829f4ec..d2fee77 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,6 @@ event_channel = 0 event_roles = [0] # Timezone to display events, supported timezones can be found at https://docs.rs/chrono-tz/0.5.1/chrono_tz/#modules event_timezone = "America/New_York" -# Path to logger -log_path = "hype_bot.log" +# Path to place logs in +log_path = "log/" ``` \ No newline at end of file diff --git a/src/discord/events.rs b/src/discord/events.rs index 3d78c2b..b6e34cd 100644 --- a/src/discord/events.rs +++ b/src/discord/events.rs @@ -16,6 +16,8 @@ use url::Url; #[command] /// Posts a previewed event /// +/// `~confirm` +/// /// **Note** /// You can only post events you have created. Only one preview event can exist at a time. fn confirm(ctx: &mut Context, msg: &Message, _args: Args) -> CommandResult { @@ -162,8 +164,8 @@ fn create(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult { #[command] /// Cancels an already scheduled event /// -/// `~create_event "event name"` -fn cancel(ctx: &mut Context, _msg: &Message, mut args: Args) -> CommandResult { +/// `~cancel "event name"` +fn cancel(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult { let config = get_config(&ctx.data)?; // Parse args @@ -187,5 +189,7 @@ fn cancel(ctx: &mut Context, _msg: &Message, mut args: Args) -> CommandResult { message.delete(&ctx)?; + msg.reply(&ctx, "**{}** has been canceled")?; + Ok(()) } diff --git a/src/main.rs b/src/main.rs index c0c13da..ff00af9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,9 +10,15 @@ extern crate log4rs; use chrono::{DateTime, Utc}; use clap::{App, Arg}; use log::LevelFilter; -use log4rs::append::file::FileAppender; +use log4rs::append::rolling_file::{RollingFileAppender}; use log4rs::config::{Appender, Config, Root}; use log4rs::encode::pattern::PatternEncoder; +use log4rs::append::console::ConsoleAppender; +use log4rs::append::rolling_file::policy::compound::roll::fixed_window::FixedWindowRoller; +use log4rs::append::rolling_file::policy::compound::trigger::size::SizeTrigger; +use log4rs::append::rolling_file::policy::compound::CompoundPolicy; +use log4rs::filter::threshold::ThresholdFilter; +use log4rs::init_config; use serenity::client::Client; use serenity::framework::standard::macros::{group, help}; use serenity::framework::standard::{help_commands, Args, CommandGroup, HelpOptions}; @@ -25,18 +31,18 @@ use std::collections::HashSet; use std::process::exit; use std::sync::Arc; use white_rabbit::{DateResult, Scheduler}; +use std::path::Path; mod database; mod discord; mod hypebot_config; -use crate::discord::schedule_event; use database::models::NewEvent; use database::*; use discord::events::{CANCEL_COMMAND, CONFIRM_COMMAND, CREATE_COMMAND}; use discord::{ delete_event, get_config, get_scheduler, log_error, permission_check, - send_message_to_reaction_users, DraftEvent, SchedulerKey, + send_message_to_reaction_users, schedule_event, DraftEvent, SchedulerKey, }; use hypebot_config::HypeBotConfig; @@ -80,7 +86,6 @@ impl EventHandler for Handler { /// On bot ready fn ready(&self, _: Context, ready: Ready) { - println!("Connected to Discord as {}", ready.user.name); info!("Connected to Discord as {}", ready.user.name); } } @@ -101,18 +106,57 @@ fn bot_help( /// Does the setup for logging fn setup_logging(config: &HypeBotConfig) -> HypeBotResult<()> { - // Setup logging - let log_encode = Box::new(PatternEncoder::new("{d}:{l}-{m}\n")); + // Build log file path + let log_file_path = Path::new(&config.log_path); + let log_file_path = log_file_path.join("hype_bot.log"); - let logfile = FileAppender::builder() - .encoder(log_encode) - .build(&config.log_path)?; + // Number of logs to keep + let window_size = 10; - let log_config = Config::builder() - .appender(Appender::builder().build("logfile", Box::new(logfile))) - .build(Root::builder().appender("logfile").build(LevelFilter::Info))?; + // 10MB file size limit + let size_limit = 1 * 1024 * 1024; + let size_trigger = SizeTrigger::new(size_limit); - log4rs::init_config(log_config)?; + let fixed_window_roller = FixedWindowRoller::builder() + .build("hype_bot.{}.log", window_size) + .unwrap(); + + let compound_policy = + CompoundPolicy::new(Box::new(size_trigger), Box::new(fixed_window_roller)); + + let config = Config::builder() + .appender( + Appender::builder() + .filter(Box::new(ThresholdFilter::new(LevelFilter::Info))) + .build( + "logfile", + Box::new( + RollingFileAppender::builder() + .encoder(Box::new(PatternEncoder::new("{d} {l}::{m}{n}"))) + .build(log_file_path, Box::new(compound_policy))?, + ), + ), + ) + .appender( + Appender::builder() + .filter(Box::new(ThresholdFilter::new(LevelFilter::Info))) + .build( + "stdout", + Box::new( + ConsoleAppender::builder() + .encoder(Box::new(PatternEncoder::new("{l}::{m}{n}"))) + .build(), + ), + ), + ) + .build( + Root::builder() + .appender("logfile") + .appender("stdout") + .build(LevelFilter::Info), + )?; + + init_config(config)?; Ok(()) } @@ -195,7 +239,7 @@ fn main() -> HypeBotResult<()> { data.insert::(scheduler); } - // schedule + // Schedule current events let config = get_config(&client.data).expect("Unable to find get config"); let duration = chrono::Duration::minutes(60); for event in get_all_events(config.db_url.clone()).unwrap() { @@ -222,9 +266,8 @@ fn main() -> HypeBotResult<()> { // Start bot info!("Starting HypeBot!"); - println!("Starting HypeBot!"); if let Err(why) = client.start() { - println!("An error occurred while running the client: {:?}", why); + error!("An error occurred while running the client: {:?}", why); } } else { // Print help