Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add logging to file functionality #444

Closed
wants to merge 16 commits into from
Closed
274 changes: 245 additions & 29 deletions Cargo.lock

Large diffs are not rendered by default.

12 changes: 10 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ de_gui.workspace = true
de_index.workspace = true
de_loader.workspace = true
de_lobby_client.workspace = true
de_log.workspace = true
de_menu.workspace = true
de_movement.workspace = true
de_objects.workspace = true
Expand All @@ -49,6 +50,7 @@ de_terrain.workspace = true

# Other
bevy.workspace = true
tracing.workspace = true

[workspace]
members = ["crates/*"]
Expand Down Expand Up @@ -79,6 +81,7 @@ de_index = { path = "crates/index", version = "0.1.0-dev" }
de_loader = { path = "crates/loader", version = "0.1.0-dev" }
de_lobby_client = { path = "crates/lobby_client", version = "0.1.0-dev" }
de_lobby_model = { path = "crates/lobby_model", version = "0.1.0-dev" }
de_log = { path = "crates/log", version = "0.1.0-dev" }
de_map = { path = "crates/map", version = "0.1.0-dev" }
de_menu = { path = "crates/menu", version = "0.1.0-dev" }
de_movement = { path = "crates/movement", version = "0.1.0-dev" }
Expand All @@ -99,17 +102,21 @@ async-compat = "0.2.1"
async-std = "1.11"
async-tar = "0.4.2"
bevy = "0.10"
chrono = "0.4.24"
clap = { version = "4.0", features = ["derive"] }
criterion = "0.4"
dirs = "4.0.0"
enum-iterator = "1.4.0"
enum-map = "2.3.0"
fern = "0.6.2"
flate2 = "1.0.26"
futures = "0.3.28"
futures-lite = "1.11"
glam = "0.23"
gltf = "1.0"
itertools = "0.10.5"
iyes_progress = "0.8.0"
log = "0.4.17"
nalgebra = { version = "0.32.2", features = ["convert-glam023"] }
nix = "0.26.2"
ntest = "0.9.0"
Expand All @@ -124,7 +131,8 @@ sha3 = "0.10.6"
spade = "2.0.0"
thiserror = "1.0"
tinyvec = { version = "1.6.0", features = ["rustc_1_40", "alloc"] }
tracing = "0.1.37"
tracing-subscriber = "0.3.16"
tracing = "0.1.26"
tracing-appender = "0.2.2"
tracing-subscriber = { version = "0.3.17" }
url = { version = "2.3.1", features = ["serde"] }
urlencoding = "2.1.2"
8 changes: 5 additions & 3 deletions crates/core/src/assets.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ pub fn asset_path<P: AsRef<Path>>(path: P) -> PathBuf {
assert!(path.is_relative(), "Asset path is not relative: {path:?}");
let mut new_path = match env::var("CARGO_MANIFEST_DIR") {
Ok(path) => PathBuf::from(path),
Err(_) => {
current_exe().expect("Failed to retrieve current executable path during map loading")
}
Err(_) => current_exe()
.expect("Failed to retrieve current executable path during map loading")
.parent()
.unwrap()
.to_path_buf(),
};
new_path.push("assets");
new_path.push(path);
Expand Down
24 changes: 24 additions & 0 deletions crates/log/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[package]
name = "de_log"
description = "Digital Extinction logging to file."

version.workspace = true
edition.workspace = true
authors.workspace = true
repository.workspace = true
keywords.workspace = true
homepage.workspace = true
license.workspace = true
categories.workspace = true

[dependencies]
# DE
de_core.workspace = true

# Other
bevy.workspace = true
chrono.workspace = true
flate2.workspace = true
tracing-appender.workspace = true
tracing-subscriber.workspace = true
tracing.workspace = true
12 changes: 12 additions & 0 deletions crates/log/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
mod setup;
use bevy::{app::PluginGroupBuilder, prelude::PluginGroup};

use crate::setup::LogPlugin;

pub struct LogPluginGroup;

impl PluginGroup for LogPluginGroup {
fn build(self) -> PluginGroupBuilder {
PluginGroupBuilder::start::<Self>().add(LogPlugin {})
}
}
42 changes: 42 additions & 0 deletions crates/log/src/setup.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
use std::path::PathBuf;

use bevy::prelude::*;
use tracing::Level;
use tracing_appender::non_blocking::WorkerGuard;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::{fmt, EnvFilter};

pub(crate) struct LogPlugin;

/// the handle for the guard (dropping it will disable the log writer)
#[derive(Resource)]
pub(crate) struct CurrentLogHandle {
#[allow(dead_code)]
guard: WorkerGuard,
}

impl Plugin for LogPlugin {
fn build(&self, app: &mut App) {
// for file name
let dt = chrono::Local::now();
let path: PathBuf = dt.format("%Y-%m-%d_%H-%M-%S.log").to_string().into();

let file_appender = tracing_appender::rolling::never("logs", path);

let (non_blocking_log_writer, _guard) = tracing_appender::non_blocking(file_appender);

let collector = tracing_subscriber::registry()
.with(
EnvFilter::builder()
// defaults to INFO if RUST_LOG not set
.with_default_directive(Level::INFO.into())
.from_env_lossy(),
)
.with(fmt::layer().with_writer(std::io::stdout))
.with(fmt::layer().with_writer(non_blocking_log_writer));
tracing::subscriber::set_global_default(collector)
.expect("Unable to set a global collector");

app.insert_resource(CurrentLogHandle { guard: _guard });
}
}
2 changes: 1 addition & 1 deletion crates/terrain/src/plugin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ fn setup_textures(
// processing. This is however not yet supported by Bevy.
//
// https://github.com/bevyengine/bevy/discussions/3972
let mut image = images.get_mut(&textures.0).unwrap();
let image = images.get_mut(&textures.0).unwrap();
image.sampler_descriptor = ImageSampler::Descriptor(SamplerDescriptor {
address_mode_u: AddressMode::Repeat,
address_mode_v: AddressMode::Repeat,
Expand Down
76 changes: 45 additions & 31 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use bevy::log::LogPlugin;
#[cfg(not(target_os = "macos"))]
use bevy::window::{CursorGrabMode, PrimaryWindow};
use bevy::{
Expand All @@ -16,56 +17,69 @@ use de_gui::GuiPluginGroup;
use de_index::IndexPluginGroup;
use de_loader::LoaderPluginGroup;
use de_lobby_client::LobbyClientPluginGroup;
use de_log::LogPluginGroup;
use de_menu::MenuPluginGroup;
use de_movement::MovementPluginGroup;
use de_objects::ObjectsPluginGroup;
use de_pathing::PathingPluginGroup;
use de_signs::SignsPluginGroup;
use de_spawner::SpawnerPluginGroup;
use de_terrain::TerrainPluginGroup;
use tracing::{span, Level};

const CARGO_PKG_VERSION: &str = env!("CARGO_PKG_VERSION");
const GIT_SHA: &str = env!("GIT_SHA");

fn main() {
let mut app = App::new();
app.insert_resource(Msaa::Sample4)
.add_plugins(DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
title: "Digital Extinction".to_string(),
mode: WindowMode::BorderlessFullscreen,
..Default::default()
}),
..default()
}))
.add_plugin(LogDiagnosticsPlugin::default())
.add_plugin(FrameTimeDiagnosticsPlugin::default())
.add_plugin(GamePlugin)
.add_plugins(ConfigPluginGroup)
.add_plugins(GuiPluginGroup)
.add_plugins(LobbyClientPluginGroup)
.add_plugins(MenuPluginGroup)
.add_plugins(CorePluginGroup)
.add_plugins(ObjectsPluginGroup)
.add_plugins(TerrainPluginGroup)
.add_plugins(LoaderPluginGroup)
.add_plugins(IndexPluginGroup)
.add_plugins(PathingPluginGroup)
.add_plugins(SignsPluginGroup)
.add_plugins(SpawnerPluginGroup)
.add_plugins(MovementPluginGroup)
.add_plugins(ControllerPluginGroup)
.add_plugins(CameraPluginGroup)
.add_plugins(BehaviourPluginGroup)
.add_plugins(CombatPluginGroup)
.add_plugins(ConstructionPluginGroup);
// we want logging as early as possible
app.add_plugins(LogPluginGroup);

// This has to be after LogPlugin is inserted.
info!(
"Starting Digital Extinction {{ \"Version\": \"{}\", \"GitSha\": \"{}\" }}",
CARGO_PKG_VERSION, GIT_SHA
);

{
let span = span!(Level::TRACE, "Startup");
let _enter = span.enter();

app.insert_resource(Msaa::Sample4)
.add_plugins(
DefaultPlugins
.set(WindowPlugin {
primary_window: Some(Window {
title: "Digital Extinction".to_string(),
mode: WindowMode::BorderlessFullscreen,
..Default::default()
}),
..default()
})
.disable::<LogPlugin>(),
)
.add_plugin(LogDiagnosticsPlugin::default())
.add_plugin(FrameTimeDiagnosticsPlugin::default())
.add_plugin(GamePlugin)
.add_plugins(ConfigPluginGroup)
.add_plugins(GuiPluginGroup)
.add_plugins(LobbyClientPluginGroup)
.add_plugins(MenuPluginGroup)
.add_plugins(CorePluginGroup)
.add_plugins(ObjectsPluginGroup)
.add_plugins(TerrainPluginGroup)
.add_plugins(LoaderPluginGroup)
.add_plugins(IndexPluginGroup)
.add_plugins(PathingPluginGroup)
.add_plugins(SignsPluginGroup)
.add_plugins(SpawnerPluginGroup)
.add_plugins(MovementPluginGroup)
.add_plugins(ControllerPluginGroup)
.add_plugins(CameraPluginGroup)
.add_plugins(BehaviourPluginGroup)
.add_plugins(CombatPluginGroup)
.add_plugins(ConstructionPluginGroup);
}

app.run();
}

Expand Down