class_docstr: Logging/Custom Handlers for proxy.
  
  Implemented mainly to:
  - log successful/failed db read/writes
  - support the max parallel request integration
class_docstr_tok: ["Logging\/Custom","Handlers","for","proxy",".","Implemented","mainly","to",":","-","log","successful\/failed","db","read\/writes","-","support","the","max","parallel","request","integration"]
code: def __init__(self, user_api_key_cache: DualCache):
      ## INITIALIZE  LITELLM CALLBACKS ##
      self.call_details: dict = {}
      self.call_details["user_api_key_cache"] = user_api_key_cache
      self.max_parallel_request_limiter = MaxParallelRequestsHandler()
      self.max_budget_limiter = MaxBudgetLimiter()
      self.alerting: Optional[List] = None
      self.alerting_threshold: float = (
          300  # default to 5 min. threshold
      )
      pass
  
imports: from typing import Optional, List, Any, Literal, Union
  import os, subprocess, hashlib, importlib, asyncio, copy, json, aiohttp, httpx
  import litellm, backoff
  from litellm.proxy._types import UserAPIKeyAuth, DynamoDBArgs
  from litellm.caching import DualCache
  from litellm.proxy.hooks.parallel_request_limiter import MaxParallelRequestsHandler
  from litellm.proxy.hooks.max_budget_limiter import MaxBudgetLimiter
  from litellm.integrations.custom_logger import CustomLogger
  from litellm.proxy.db.base_client import CustomDB
  from fastapi import HTTPException, status
  import smtplib
  from email.mime.text import MIMEText
  from email.mime.multipart import MIMEMultipart
label_desc: Use image node_id 1 to create a new ProxyLogging object  with example: obj = ProxyLogging(user_api_key_cache)