You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.1 KiB

4 years ago
4 years ago
4 years ago
4 years ago
  1. #![forbid(unsafe_code)]
  2. use actix_demo::{AppConfig, AppData, EnvConfig, LoggerFormat};
  3. use diesel::r2d2::ConnectionManager;
  4. use diesel_tracing::sqlite::InstrumentedSqliteConnection;
  5. use io::ErrorKind;
  6. use std::io;
  7. use tracing::subscriber::set_global_default;
  8. use tracing_appender::non_blocking::WorkerGuard;
  9. use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
  10. use tracing_log::LogTracer;
  11. use tracing_subscriber::fmt::format::FmtSpan;
  12. use tracing_subscriber::{
  13. layer::SubscriberExt, EnvFilter, FmtSubscriber, Registry,
  14. };
  15. #[actix_web::main]
  16. async fn main() -> io::Result<()> {
  17. let _ = dotenv::dotenv().map_err(|err| {
  18. io::Error::new(
  19. ErrorKind::Other,
  20. format!("Failed to set up env: {:?}", err),
  21. )
  22. })?;
  23. let env_config = envy::prefixed("ACTIX_DEMO_")
  24. .from_env::<EnvConfig>()
  25. .map_err(|err| {
  26. io::Error::new(
  27. ErrorKind::Other,
  28. format!("Failed to parse config: {:?}", err),
  29. )
  30. })?;
  31. //bind guard to variable instead of _
  32. let _guard = setup_logger(env_config.logger_format)?;
  33. let connspec = &env_config.database_url;
  34. let manager =
  35. ConnectionManager::<InstrumentedSqliteConnection>::new(connspec);
  36. let pool = r2d2::Pool::builder().build(manager).map_err(|err| {
  37. io::Error::new(
  38. ErrorKind::Other,
  39. format!("Failed to create pool: {:?}", err),
  40. )
  41. })?;
  42. let _ = {
  43. let conn = &pool.get().map_err(|err| {
  44. io::Error::new(
  45. ErrorKind::Other,
  46. format!("Failed to get connection: {:?}", err),
  47. )
  48. })?;
  49. let _ =
  50. diesel_migrations::run_pending_migrations(conn).map_err(|err| {
  51. io::Error::new(
  52. ErrorKind::Other,
  53. format!("Error running migrations: {:?}", err),
  54. )
  55. })?;
  56. };
  57. let app_data = AppData {
  58. config: AppConfig {
  59. hash_cost: env_config.hash_cost,
  60. },
  61. pool: pool.clone(),
  62. };
  63. actix_demo::run(format!("{}:7800", env_config.http_host), app_data).await
  64. }
  65. pub fn setup_logger(format: LoggerFormat) -> io::Result<WorkerGuard> {
  66. let env_filter =
  67. EnvFilter::try_from_env("ACTIX_DEMO_RUST_LOG").map_err(|err| {
  68. io::Error::new(
  69. ErrorKind::Other,
  70. format!("Failed to set up env filter: {:?}", err),
  71. )
  72. })?;
  73. let (non_blocking, _guard) =
  74. tracing_appender::non_blocking(std::io::stdout());
  75. let _ = LogTracer::init().map_err(|err| {
  76. io::Error::new(
  77. ErrorKind::Other,
  78. format!("Failed to set up log tracer: {:?}", err),
  79. )
  80. })?;
  81. let bi = actix_demo::get_build_info();
  82. let _ = match format {
  83. LoggerFormat::Json => {
  84. let formatting_layer = BunyanFormattingLayer::new(
  85. format!("actix-demo-{}", bi.crate_info.version),
  86. // Output the formatted spans to non-blocking writer
  87. non_blocking,
  88. );
  89. let subscriber = Registry::default()
  90. .with(env_filter)
  91. .with(JsonStorageLayer)
  92. .with(formatting_layer);
  93. let _ = set_global_default(subscriber).map_err(|err| {
  94. io::Error::new(
  95. ErrorKind::Other,
  96. format!("Failed to set subscriber: {:?}", err),
  97. )
  98. })?;
  99. }
  100. LoggerFormat::Pretty => {
  101. let subscriber = FmtSubscriber::builder()
  102. .pretty()
  103. .with_span_events(FmtSpan::NEW)
  104. .with_span_events(FmtSpan::CLOSE)
  105. .with_env_filter(env_filter)
  106. .with_writer(non_blocking)
  107. .with_thread_names(true)
  108. .finish();
  109. let _ = set_global_default(subscriber).map_err(|err| {
  110. io::Error::new(
  111. ErrorKind::Other,
  112. format!("Failed to set subscriber: {:?}", err),
  113. )
  114. })?;
  115. }
  116. };
  117. Ok(_guard)
  118. }