code: def test_observation_statistics_logging():
      """observation normalization logging test"""
  
      # normalization config
      normalization_config = {
          "default_strategy": "maze.normalization_strategies.MeanZeroStdOneObservationNormalizationStrategy",
          "default_strategy_config": {
              "clip_range": (None, None),
              "axis": 0,
          },
          "default_statistics": None,
          "statistics_dump": "statistics.pkl",
          "exclude": None,
          "manual_config": {
              "observation": {
                  "strategy": "maze.normalization_strategies.MeanZeroStdOneObservationNormalizationStrategy",
                  "strategy_config": {"clip_range": (0, 1)},
                  "statistics": {
                      "mean": [0, 0, 0, 0],
                      "std": [1, 1, 1, 1],
                  },
              }
          },
      }
      writer = LogStatsWriterTensorboard(
          log_dir="test_log", tensorboard_render_figure=True
      )
      register_log_stats_writer(writer)
      # attach a console writer as well for immediate console feedback
      register_log_stats_writer(LogStatsWriterConsole())
  
      # init environment
      env = GymMazeEnv("CartPole-v0")
  
      # wrap env with observation normalization
      env = ObservationNormalizationWrapper(
          env,
          default_strategy=normalization_config["default_strategy"],
          default_strategy_config=normalization_config[
              "default_strategy_config"
          ],
          default_statistics=normalization_config["default_statistics"],
          statistics_dump=normalization_config["statistics_dump"],
          sampling_policy=RandomPolicy(env.action_spaces_dict),
          exclude=normalization_config["exclude"],
          manual_config=normalization_config["manual_config"],
      )
  
      env = LogStatsWrapper.wrap(env, logging_prefix="train")
  
      n_episodes = 10
      n_steps_per_episode = 100
      for episode in range(n_episodes):
          _ = env.reset()
          for step in range(n_steps_per_episode):
              # take random action
              action = env.action_space.sample()
  
              # take step in env and trigger log stats writing
              _, _, done, _ = env.step(action)
  
              if done:
                  break
  
          increment_log_step()
  
imports: import copy
  import os
  import numpy
  import pytest
  import maze.test.core.wrappers.observation_normalization
  from maze.core.agent.random_policy import RandomPolicy
  from maze.core.env.structured_env import ActorID
  from maze.core.log_stats.log_stats import register_log_stats_writer, increment_log_step
  from maze.core.log_stats.log_stats_writer_console import LogStatsWriterConsole
  from maze.core.log_stats.log_stats_writer_tensorboard import LogStatsWriterTensorboard
  from maze.core.wrappers.log_stats_wrapper import LogStatsWrapper
  from maze.core.wrappers.maze_gym_env_wrapper import GymMazeEnv
  from maze.core.wrappers.observation_normalization.normalization_strategies.base import ObservationNormalizationStrategy
  from maze.core.wrappers.observation_normalization.observation_normalization_utils import obtain_normalization_statistics
  from maze.core.wrappers.observation_normalization.observation_normalization_wrapper import ObservationNormalizationWrapper
  from maze.test.shared_test_utils.config_testing_utils import load_env_config
label_desc: Use image node_id 9 for calling a global function with example usage: test_observation_statistics_logging() without return types