class_docstr: The default monitor implementation. It uses a logger to log data and schema, and will
  write monitor data to rotating files. The schema is logged as a JSON object, and the
  data is logged as a JSON array.
class_docstr_tok: ["The","default","monitor","implementation",".","It","uses","a","logger","to","log","data","and","schema",",","and","will","write","monitor","data","to","rotating","files",".","The","schema","is","logged","as","a","JSON","object",",","and","the","data","is","logged","as","a","JSON","array","."]
docstr: Export data. This method should be called after all data is logged.
docstr_tok: ["Export","data",".","This","method","should","be","called","after","all","data","is","logged","."]
code: def export_data(
      self,
      datas: dict[str, collections.deque[JSONSerializable]],
  ) -> None:
      """
      Export data. This method should be called after all data is logged.
      """
      if self.data_logger is None:
          self._init_logger()
          assert self.data_logger is not None
  
      extra_columns = dict(
          timestamp=datetime.datetime.now().isoformat(),
          request_id=str(trace_context.request_id),
      )
      while True:
          try:
              record = {k: v.popleft() for k, v in datas.items()}
              record.update(extra_columns)
              self.data_logger.info(record)
          except IndexError:
              break
  
file_path: BentoML/src/bentoml/_internal/monitoring/default.py
imports: from __future__ import annotations
  import collections
  import datetime
  import logging
  import logging.config
  import typing
  from pathlib import Path
  import yaml
  from ..context import component_context
  from ..context import trace_context
  from .base import MonitorBase
label_desc: Use image node_id 4 for calling the DefaultMonitor obj's underlying member method code with example usage: obj.export_data(datas) without return types