class_docstr: Logs are first collected in each environment worker,
  and then aggregated to stream at the central thread in vector env.
  
  In :class:`LogCollector`, every metric is added to a dict, which needs to be ``reset()`` at each step.
  The dict is sent via the ``info`` in ``env.step()``, and decoded by the :class:`LogWriter` at vector env.
  
  ``min_loglevel`` is for optimization purposes: to avoid too much traffic on networks / in pipe.
class_docstr_tok: ["Logs","are","first","collected","in","each","environment","worker",",","and","then","aggregated","to","stream","at","the","central","thread","in","vector","env",".","In",":","class",":","`","LogCollector","`",",","every","metric","is","added","to","a","dict",",","which","needs","to","be","``","reset","(",")","``","at","each","step",".","The","dict","is","sent","via","the","``","info","``","in","``","env.step","(",")","``",",","and","decoded","by","the",":","class",":","`","LogWriter","`","at","vector","env",".","``","min_loglevel","``","is","for","optimization","purposes",":","to","avoid","too","much","traffic","on","networks","\/","in","pipe","."]
code: def logs(self) -> Dict[str, np.ndarray]:
      return {
          key: np.asanyarray(value, dtype="object")
          for key, value in self._logged.items()
      }
  
imports: from __future__ import annotations
  import logging
  from collections import defaultdict
  from enum import IntEnum
  from pathlib import Path
  from typing import TYPE_CHECKING, Any, Callable, Dict, Generic, List, Sequence, Set, Tuple, TypeVar
  import numpy
  import pandas
  from qlib.log import get_module_logger
label_desc: Use image node_id 8 for calling the LogCollector obj's underlying member method code with example usage: obj.logs() and returns: unknown