Convert voxygen to use tracing

There are several noteable changes in this commit that mean that logging
will behave differently to how it did previously.

- There are now no separate filter levels for terminal and file output.
This is a feature that is lacking in `tracing` but is set to be resolved
by https://github.com/tokio-rs/tracing/pull/508. At which point we MAY
include it.

- The default log level was previously `WARN` - it is now `INFO`.
This commit is contained in:
Kevin Glasson 2020-06-21 18:22:26 +08:00
parent 525b84ff9d
commit af3af6c169
26 changed files with 190 additions and 163 deletions

82
Cargo.lock generated
View File

@ -571,17 +571,6 @@ dependencies = [
"objc",
]
[[package]]
name = "colored"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4ffc801dacf156c5854b9df4f425a626539c3a6ef7893cc0c5084a23f0b6c59"
dependencies = [
"atty",
"lazy_static",
"winapi 0.3.8",
]
[[package]]
name = "conrod_core"
version = "0.63.0"
@ -1210,17 +1199,6 @@ dependencies = [
"synstructure",
]
[[package]]
name = "fern"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e69ab0d5aca163e388c3a49d284fed6c3d0810700e77c5ae2756a50ec1a4daaa"
dependencies = [
"chrono",
"colored",
"log",
]
[[package]]
name = "filetime"
version = "0.2.10"
@ -4251,9 +4229,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a41f40ed0e162c911ac6fcb53ecdc8134c46905fdbbae8c50add462a538b495f"
dependencies = [
"cfg-if",
"tracing-attributes",
"tracing-core",
]
[[package]]
name = "tracing-appender"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e86a61ff69b54f44ffdf02cf27f2da864639dde602d5f90d9f7ef2ea76629c0"
dependencies = [
"chrono",
"crossbeam-channel 0.4.2",
"tracing-subscriber",
]
[[package]]
name = "tracing-attributes"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99bbad0de3fd923c9c3232ead88510b783e5a4d16a6154adffa3d53308de984c"
dependencies = [
"proc-macro2 1.0.18",
"quote 1.0.7",
"syn 1.0.31",
]
[[package]]
name = "tracing-core"
version = "0.1.10"
@ -4274,19 +4275,44 @@ dependencies = [
]
[[package]]
name = "tracing-subscriber"
version = "0.2.5"
name = "tracing-log"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d53c40489aa69c9aed21ff483f26886ca8403df33bdc2d2f87c60c1617826d2"
checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9"
dependencies = [
"lazy_static",
"log",
"tracing-core",
]
[[package]]
name = "tracing-serde"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6ccba2f8f16e0ed268fc765d9b7ff22e965e7185d32f8f1ec8294fe17d86e79"
dependencies = [
"serde",
"tracing-core",
]
[[package]]
name = "tracing-subscriber"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04a11b459109e38ff6e1b580bafef4142a11d44889f5d07424cbce2fd2a2a119"
dependencies = [
"ansi_term",
"chrono",
"lazy_static",
"matchers",
"regex",
"serde",
"serde_json",
"sharded-slab",
"smallvec 1.4.0",
"tracing-core",
"tracing-log",
"tracing-serde",
]
[[package]]
@ -4567,7 +4593,6 @@ dependencies = [
"dot_vox",
"euc",
"failure",
"fern",
"gfx",
"gfx_device_gl",
"gfx_window_glutin",
@ -4578,7 +4603,6 @@ dependencies = [
"guillotiere",
"hashbrown",
"image",
"log",
"msgbox",
"num 0.2.1",
"rand 0.7.3",
@ -4588,6 +4612,10 @@ dependencies = [
"serde_derive",
"specs",
"specs-idvs",
"tracing",
"tracing-appender",
"tracing-log",
"tracing-subscriber",
"treeculler",
"uvth 3.1.1",
"vek",

View File

@ -48,14 +48,12 @@ server = { package = "veloren-server", path = "../server", optional = true }
# Utility
glsl-include = "0.3.1"
failure = "0.1.6"
log = "0.4.8"
dot_vox = "4.0"
image = { version = "0.22.5", default-features = false, features = ["ico", "png"] }
serde = "1.0"
serde_derive = "1.0"
ron = { version = "0.6", default-features = false }
guillotiere = { git = "https://github.com/Imberflur/guillotiere" }
fern = { version = "0.5.8", features = ["colored"] }
msgbox = { git = "https://github.com/bekker/msgbox-rs.git", default-features = false, rev = "68fe39a", optional = true }
directories = "2.0.2"
num = "0.2.0"
@ -73,6 +71,15 @@ uvth = "3.1.1"
authc = { git = "https://gitlab.com/veloren/auth.git", rev = "223a4097f7ebc8d451936dccb5e6517194bbf086" }
const-tweaker = { version = "0.2.5", optional = true }
# # Logging
# log = "0.4.8"
# fern = { version = "0.5.8", features = ["colored"] }
# Logging (new)
tracing = { version = "0.1", default-features = false , features = ["attributes"] }
tracing-subscriber = { version = "0.2.3", default-features = false, features = ["env-filter", "fmt", "chrono", "ansi", "smallvec", "registry", "tracing-log"] }
tracing-log = "0.1.1"
tracing-appender = "0.1"
[target.'cfg(target_os = "macos")'.dependencies]
dispatch = "0.1.4"

View File

@ -69,7 +69,7 @@ pub fn init() {
info.push_str(&path);
info.push('\"');
}
log::warn!("{}", info);
warn!("{}", info);
// Reload
reload();
@ -96,7 +96,7 @@ fn event_fn(res: notify::Result<notify::Event>, sender: &mpsc::Sender<String>) {
},
_ => {},
},
Err(e) => log::error!("Animation hotreload watcher error: {:?}", e),
Err(e) => error!("Animation hotreload watcher error: {:?}", e),
}
}
@ -119,7 +119,7 @@ fn reload() {
// Open new lib
*lock = Some(LoadedLib::load());
log::warn!("Updated animations");
warn!("Updated animations");
}
// Returns false if compile failed
@ -135,10 +135,10 @@ fn compile() -> bool {
// If compile failed
if !output.status.success() {
log::error!("Failed to compile anim crate");
error!("Failed to compile anim crate");
false
} else {
log::warn!("Animation recompile success!!");
warn!("Animation recompile success!!");
true
}
}

View File

@ -9,6 +9,7 @@ pub mod soundcache;
use channel::{MusicChannel, MusicChannelTag, SfxChannel};
use fader::Fader;
use soundcache::SoundCache;
use tracing::warn;
use common::assets;
use cpal::traits::DeviceTrait;
@ -272,7 +273,7 @@ fn list_devices_raw() -> Vec<Device> {
devices.filter(|d| d.name().is_ok()).collect()
},
Err(_) => {
log::warn!("Failed to enumerate audio output devices, audio will not be available");
warn!("Failed to enumerate audio output devices, audio will not be available");
Vec::new()
},
}

View File

@ -37,12 +37,12 @@
//! tracks
//! - If you are not the author of the track, ensure that the song's licensing
//! permits usage of the track for non-commercial use
use crate::audio::AudioFrontend;
use common::{assets, state::State};
use rand::{seq::IteratorRandom, thread_rng};
use serde::Deserialize;
use std::time::Instant;
use tracing::warn;
const DAY_START_SECONDS: u32 = 28800; // 8:00
const DAY_END_SECONDS: u32 = 70200; // 19:30
@ -146,7 +146,7 @@ impl MusicMgr {
Ok(file) => match ron::de::from_reader(file) {
Ok(config) => config,
Err(error) => {
log::warn!(
warn!(
"Error parsing music config file, music will not be available: {}",
format!("{:#?}", error)
);
@ -155,7 +155,7 @@ impl MusicMgr {
},
},
Err(error) => {
log::warn!(
warn!(
"Error reading music config file, music will not be available: {}",
format!("{:#?}", error)
);

View File

@ -94,6 +94,7 @@ use event_mapper::SfxEventMapper;
use hashbrown::HashMap;
use serde::Deserialize;
use specs::WorldExt;
use tracing::warn;
use vek::*;
/// We watch the states of nearby entities in order to emit SFX at their
@ -193,7 +194,7 @@ impl SfxMgr {
Ok(file) => match ron::de::from_reader(file) {
Ok(config) => config,
Err(error) => {
log::warn!(
warn!(
"Error parsing sfx config file, sfx will not be available: {}",
format!("{:#?}", error)
);
@ -202,7 +203,7 @@ impl SfxMgr {
},
},
Err(error) => {
log::warn!(
warn!(
"Error reading sfx config file, sfx will not be available: {}",
format!("{:#?}", error)
);

View File

@ -3,6 +3,7 @@
use common::assets;
use hashbrown::HashMap;
use std::{convert::AsRef, io, io::Read, sync::Arc};
use tracing::warn;
// Implementation of sound taken from this github issue:
// https://github.com/RustAudio/rodio/issues/141
@ -52,7 +53,7 @@ impl SoundCache {
.entry(name.to_string())
.or_insert_with(|| {
Sound::load(name).unwrap_or_else(|_| {
log::warn!("SoundCache: Failed to load sound: {}", name);
warn!("SoundCache: Failed to load sound: {}", name);
Sound::empty()
})

View File

@ -4,8 +4,8 @@ use common::{
state::DeltaTime,
util::Dir,
};
use log::warn;
use specs::{Entities, Join, Read, ReadStorage, System, WriteStorage};
use tracing::warn;
use vek::*;
/// This system will allow NPCs to modify their controller

View File

@ -12,9 +12,9 @@ use conrod_core::image::Id;
use dot_vox::DotVoxData;
use hashbrown::HashMap;
use image::DynamicImage;
use log::{error, warn};
use serde_derive::{Deserialize, Serialize};
use std::{fs::File, io::BufReader, sync::Arc};
use tracing::{error, warn};
use vek::*;
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]

View File

@ -10,6 +10,7 @@ use std::{
fs::File,
io::BufReader,
};
use tracing::warn;
/// The reference language, aka the more up-to-date localization data.
/// Also the default language at first startup.
@ -124,17 +125,15 @@ impl VoxygenLocalization {
pub fn log_missing_entries(&self) {
let (missing_strings, missing_vectors) = self.list_missing_entries();
for missing_key in missing_strings {
log::warn!(
warn!(
"[{:?}] Missing string key {:?}",
self.metadata.language_identifier,
missing_key
self.metadata.language_identifier, missing_key
);
}
for missing_key in missing_vectors {
log::warn!(
warn!(
"[{:?}] Missing vector key {:?}",
self.metadata.language_identifier,
missing_key
self.metadata.language_identifier, missing_key
);
}
}

View File

@ -1,82 +1,79 @@
use fern::colors::{Color, ColoredLevelConfig};
use std::fs;
use crate::settings::Settings;
#[allow(clippy::or_fun_call)] // TODO: Pending review in #587
pub fn init(
settings: &Settings,
term_log_level: log::LevelFilter,
file_log_level: log::LevelFilter,
) {
let colors = ColoredLevelConfig::new()
.error(Color::Red)
.warn(Color::Yellow)
.info(Color::Cyan)
.debug(Color::Green)
.trace(Color::BrightBlack);
use tracing::{error, info, instrument};
use tracing_subscriber::{filter::LevelFilter, prelude::*, registry, EnvFilter};
let mut base = fern::Dispatch::new()
.level_for("dot_vox::parser", log::LevelFilter::Warn)
.level_for("gfx_device_gl::factory", log::LevelFilter::Warn)
.level_for("uvth", log::LevelFilter::Warn)
.level_for("tiny_http", log::LevelFilter::Warn);
const VOXYGEN_LOG_ENV: &str = "VOXYGEN_LOG";
let time = chrono::offset::Utc::now();
/// Initialise tracing and logging fro the settings.
///
/// This function will attempt to set up both a file and a terminal logger,
/// falling back to just a terminal logger if the file is unable to be created.
///
/// The logging level is by deafult set to `INFO`, to change this for any
/// particular crate or module you must use the `VOXYGEN_LOG` environment
/// variable.
///
/// For example to set this crate's debug level to `TRACE` you would need the
/// following in your environment.
///
/// `VOXYGEN_LOG="veloren_voxygen=trace"`
#[instrument]
pub fn init(settings: &Settings) -> Vec<impl Drop> {
// To hold the guards that we create, they will cause the logs to be
// flushed when they're dropped.
let mut _guards = vec![];
let mut file_cfg =
fern::Dispatch::new()
.level(file_log_level)
.format(|out, message, record| {
out.finish(format_args!(
"{}[{}:{}][{}] {}",
chrono::Local::now().format("[%Y-%m-%d][%H:%M:%S]"),
record.target(),
record
.line()
.map(|x| x.to_string())
.unwrap_or("X".to_string()),
record.level(),
message
))
});
// We will do lower logging than the default (INFO) by INCLUSION. This
// means that if you need lower level logging for a specific module, then
// put it in the environment in the correct format i.e. DEBUG logging for
// this crate with would be veloren_voxygen=debug.
let filter = EnvFilter::from_env(VOXYGEN_LOG_ENV)
.add_directive("dot_vox::parser=warn".parse().unwrap())
.add_directive("gfx_device_gl::factory=warn".parse().unwrap())
.add_directive("gfx_device_gl::shade=warn".parse().unwrap())
.add_directive("uvth=warn".parse().unwrap())
.add_directive("tiny_http=warn".parse().unwrap())
.add_directive(LevelFilter::INFO.into());
// Try to create the logs file parent directories.
let mut log_file_created = fs::create_dir_all(&settings.log.logs_path);
// Create the terminal writer layer.
let (non_blocking, _stdio_guard) = tracing_appender::non_blocking(std::io::stdout());
_guards.push(_stdio_guard);
if log_file_created.is_ok() {
// Try to create the log file.
match fern::log_file(
settings
.log
.logs_path
.join(&format!("voxygen-{}.log", time.format("%Y-%m-%d-%H"))),
) {
Ok(log_file) => file_cfg = file_cfg.chain(log_file),
Err(e) => log_file_created = Err(e),
}
}
// Try to create the log file's parent folders.
let log_folders_created = fs::create_dir_all(&settings.log.logs_path);
let stdout_cfg = fern::Dispatch::new()
.level(term_log_level)
.format(move |out, message, record| {
out.finish(format_args!(
"[{}] {}",
colors.color(record.level()),
message
))
})
.chain(std::io::stdout());
match log_folders_created {
// If the parent folders were created then attach both a terminal and a
// file writer to the registry and init it.
Ok(_) => {
let file_appender =
tracing_appender::rolling::daily(&settings.log.logs_path, "voxygen.log");
let (non_blocking_file, _file_guard) = tracing_appender::non_blocking(file_appender);
_guards.push(_file_guard);
registry()
.with(tracing_subscriber::fmt::layer().with_writer(non_blocking))
.with(tracing_subscriber::fmt::layer().with_writer(non_blocking_file))
.with(filter)
.init();
info!("Setup terminal and file logging.");
},
// Otherwise just add a terminal writer and init it.
Err(e) => {
error!(
"Failed to create log file! {}. Falling back to terminal logging only.",
e
);
registry()
.with(tracing_subscriber::fmt::layer().with_writer(non_blocking))
.with(filter)
.init();
info!("Setup terminal logging.");
},
};
if settings.log.log_to_file {
base = base.chain(file_cfg);
}
base.chain(stdout_cfg)
.apply()
.expect("Failed to setup logging!");
// Incase that the log file creation failed simply print it to the console
if let Err(e) = log_file_created {
log::error!("Failed to create log file! {}", e);
}
// Return the guards
_guards
}

View File

@ -15,34 +15,25 @@ use veloren_voxygen::{
};
use common::assets::{load, load_expect};
use log::{debug, error};
use std::{mem, panic, str::FromStr};
use std::{mem, panic};
use tracing::{debug, error, instrument, warn};
#[instrument]
fn main() {
#[cfg(feature = "tweak")]
const_tweaker::run().expect("Could not run server");
// Initialize logging.
let term_log_level = std::env::var_os("VOXYGEN_LOG")
.and_then(|env| env.to_str().map(|s| s.to_owned()))
.and_then(|s| log::LevelFilter::from_str(&s).ok())
.unwrap_or(log::LevelFilter::Warn);
let file_log_level = std::env::var_os("VOXYGEN_FILE_LOG")
.and_then(|env| env.to_str().map(|s| s.to_owned()))
.and_then(|s| log::LevelFilter::from_str(&s).ok())
.unwrap_or(log::LevelFilter::Debug);
// Load the settings
// Note: This won't log anything due to it being called before
// ``logging::init``. The issue is we need to read a setting to decide
// `logging::init`. The issue is we need to read a setting to decide
// whether we create a log file or not.
let settings = Settings::load();
let profile = Profile::load();
// Init logging and hold the guards.
let _guards = logging::init(&settings);
logging::init(&settings, term_log_level, file_log_level);
// Save settings to add new fields or create the file if it is not already there
// Save settings to add new fields or create the file if it is not already
// there.
if let Err(err) = settings.save_to_file() {
panic!("Failed to save settings: {:?}", err);
}
@ -58,6 +49,9 @@ fn main() {
audio.set_music_volume(settings.audio.music_volume);
audio.set_sfx_volume(settings.audio.sfx_volume);
// Load the profile.
let profile = Profile::load();
let mut global_state = GlobalState {
audio,
profile,
@ -72,11 +66,10 @@ fn main() {
&global_state.settings.language.selected_language,
))
.unwrap_or_else(|error| {
log::warn!(
warn!(
"Impossible to load {} language: change to the default language (English) instead. \
Source error: {:?}",
&global_state.settings.language.selected_language,
error
&global_state.settings.language.selected_language, error
);
global_state.settings.language.selected_language = i18n::REFERENCE_LANG.to_owned();
load_expect::<VoxygenLocalization>(&i18n_asset_key(

View File

@ -9,9 +9,9 @@ use crate::{
};
use client::{self, Client};
use common::{assets, clock::Clock, comp, msg::ClientState, state::DeltaTime};
use log::error;
use specs::WorldExt;
use std::{cell::RefCell, rc::Rc, time::Duration};
use tracing::error;
use ui::CharSelectionUi;
pub struct CharSelectionState {

View File

@ -7,9 +7,9 @@ use crate::{
};
use client_init::{ClientInit, Error as InitError, Msg as InitMsg};
use common::{assets::load_expect, clock::Clock, comp};
use log::{error, warn};
#[cfg(feature = "singleplayer")]
use std::time::Duration;
use tracing::{error, warn};
use ui::{Event as MainMenuEvent, MainMenuUi};
pub struct MainMenuState {

View File

@ -1,8 +1,8 @@
use common::comp;
use directories::ProjectDirs;
use log::warn;
use serde_derive::{Deserialize, Serialize};
use std::{fs, io::Write, path::PathBuf};
use tracing::warn;
const VALID_VERSION: u32 = 0; // Change this if you broke charsaves
#[derive(Clone, Debug, Serialize, Deserialize)]
@ -47,13 +47,13 @@ impl Meta {
}
},
Err(e) => {
log::warn!("Failed to parse meta file! Fallback to default. {}", e);
warn!("Failed to parse meta file! Fallback to default. {}", e);
// Rename the corrupted settings file
let mut new_path = path.to_owned();
new_path.pop();
new_path.push("meta.invalid.ron");
if let Err(err) = std::fs::rename(path, new_path) {
log::warn!("Failed to rename meta file. {}", err);
warn!("Failed to rename meta file. {}", err);
}
},
}
@ -90,7 +90,7 @@ impl Meta {
if meta.exists() || meta.parent().map(|x| x.exists()).unwrap_or(false) {
return meta;
}
log::warn!("VOXYGEN_CONFIG points to invalid path.");
warn!("VOXYGEN_CONFIG points to invalid path.");
}
let proj_dirs = ProjectDirs::from("net", "veloren", "voxygen")

View File

@ -1,9 +1,9 @@
use crate::hud;
use directories::ProjectDirs;
use hashbrown::HashMap;
use log::warn;
use serde_derive::{Deserialize, Serialize};
use std::{fs, io::prelude::*, path::PathBuf};
use tracing::warn;
/// Represents a character in the profile.
#[derive(Clone, Debug, Serialize, Deserialize)]
@ -65,14 +65,14 @@ impl Profile {
match ron::de::from_reader(file) {
Ok(profile) => return profile,
Err(e) => {
log::warn!(
warn!(
"Failed to parse profile file! Falling back to default. {}",
e
);
// Rename the corrupted profile file.
let new_path = path.with_extension("invalid.ron");
if let Err(err) = std::fs::rename(path, new_path) {
log::warn!("Failed to rename profile file. {}", err);
warn!("Failed to rename profile file. {}", err);
}
},
}
@ -161,7 +161,7 @@ impl Profile {
if profile.exists() || profile.parent().map(|x| x.exists()).unwrap_or(false) {
return profile;
}
log::warn!("VOXYGEN_CONFIG points to invalid path.");
warn!("VOXYGEN_CONFIG points to invalid path.");
}
let proj_dirs = ProjectDirs::from("net", "veloren", "voxygen")

View File

@ -16,7 +16,7 @@ use gfx::{
traits::{Device, Factory, FactoryExt},
};
use glsl_include::Context as IncludeContext;
use log::error;
use tracing::error;
use vek::*;
/// Represents the format of the pre-processed color target.

View File

@ -24,9 +24,9 @@ use common::{
};
use dot_vox::DotVoxData;
use hashbrown::HashMap;
use log::{error, warn};
use serde_derive::{Deserialize, Serialize};
use std::{fs::File, io::BufReader, sync::Arc};
use tracing::{error, warn};
use vek::*;
fn load_segment(mesh_name: &str) -> Segment {

View File

@ -30,8 +30,8 @@ use common::{
vol::RectRasterableVol,
};
use hashbrown::HashMap;
use log::trace;
use specs::{Entity as EcsEntity, Join, WorldExt};
use tracing::trace;
use treeculler::{BVol, BoundingSphere};
use vek::*;

View File

@ -21,7 +21,7 @@ use common::{
terrain::BlockKind,
vol::{BaseVol, ReadVol, Vox},
};
use log::error;
use tracing::error;
use vek::*;
#[derive(PartialEq, Eq, Copy, Clone)]

View File

@ -21,9 +21,9 @@ use common::{
vol::ReadVol,
ChatType,
};
use log::{error, info};
use specs::{Join, WorldExt};
use std::{cell::RefCell, rc::Rc, time::Duration};
use tracing::{error, info};
use vek::*;
/// The action to perform after a tick
@ -761,7 +761,7 @@ impl PlayState for SessionState {
global_state.profile.save_to_file_warn();
log::info!("Event! -> ChangedHotbarState")
info!("Event! -> ChangedHotbarState")
},
HudEvent::Ability3(state) => self.inputs.ability3.set_state(state),
HudEvent::ChangeFOV(new_fov) => {

View File

@ -8,9 +8,9 @@ use crate::{
use directories::{ProjectDirs, UserDirs};
use glutin::{MouseButton, VirtualKeyCode};
use hashbrown::{HashMap, HashSet};
use log::warn;
use serde_derive::{Deserialize, Serialize};
use std::{fs, io::prelude::*, path::PathBuf};
use tracing::warn;
// ControlSetting-like struct used by Serde, to handle not serializing/building
// post-deserializing the inverse_keybindings hashmap
@ -718,13 +718,13 @@ impl Settings {
match ron::de::from_reader(file) {
Ok(s) => return s,
Err(e) => {
log::warn!("Failed to parse setting file! Fallback to default. {}", e);
warn!("Failed to parse setting file! Fallback to default. {}", e);
// Rename the corrupted settings file
let mut new_path = path.to_owned();
new_path.pop();
new_path.push("settings.invalid.ron");
if let Err(err) = std::fs::rename(path, new_path) {
log::warn!("Failed to rename settings file. {}", err);
warn!("Failed to rename settings file. {}", err);
}
},
}
@ -761,7 +761,7 @@ impl Settings {
if settings.exists() || settings.parent().map(|x| x.exists()).unwrap_or(false) {
return settings;
}
log::warn!("VOXYGEN_CONFIG points to invalid path.");
warn!("VOXYGEN_CONFIG points to invalid path.");
}
let proj_dirs = ProjectDirs::from("net", "veloren", "voxygen")

View File

@ -1,7 +1,6 @@
use client::Client;
use common::clock::Clock;
use crossbeam::channel::{unbounded, Receiver, Sender, TryRecvError};
use log::info;
use server::{Event, Input, Server, ServerSettings};
use std::{
sync::{
@ -11,6 +10,7 @@ use std::{
thread::{self, JoinHandle},
time::Duration,
};
use tracing::info;
const TPS: u64 = 30;

View File

@ -8,9 +8,9 @@ use common::figure::Segment;
use guillotiere::{size2, SimpleAtlasAllocator};
use hashbrown::{hash_map::Entry, HashMap};
use image::{DynamicImage, RgbaImage};
use log::warn;
use pixel_art::resize_pixel_art;
use std::sync::Arc;
use tracing::warn;
use vek::*;
#[derive(Clone)]

View File

@ -44,7 +44,6 @@ use conrod_core::{
Rect, UiBuilder, UiCell,
};
use graphic::{Rotation, TexId};
use log::{error, warn};
use std::{
f32, f64,
fs::File,
@ -53,6 +52,7 @@ use std::{
sync::Arc,
time::Duration,
};
use tracing::{error, warn};
use vek::*;
#[derive(Debug)]

View File

@ -8,9 +8,9 @@ use gilrs::{EventType, Gilrs};
use hashbrown::HashMap;
use crossbeam::channel;
use log::{error, warn};
use serde_derive::{Deserialize, Serialize};
use std::fmt;
use tracing::{error, warn};
use vek::*;
/// Represents a key that the game recognises after input mapping.