code: def start_action(logger=None, action_type="", _serializers=None, **fields):
      
      parent = current_action()
      if parent is None:
          return startTask(logger, action_type, _serializers, **fields)
      else:
          action = parent.child(logger, action_type, _serializers)
          action._start(fields)
          return action
docs: Create a child L{Action}, figuring out the parent L{Action} from execution
      context, and log the start message.
  
      You can use the result as a Python context manager, or use the
      L{Action.finish} API to explicitly finish it.
  
           with start_action(logger, "yourapp:subsystem:dosomething",
                            entry=x) as action:
                do(x)
                result = something(x * 2)
                action.addSuccessFields(result=result)
  
      Or alternatively:
  
           action = start_action(logger, "yourapp:subsystem:dosomething",
                                entry=x)
           with action.context():
                do(x)
                result = something(x * 2)
                action.addSuccessFields(result=result)
           action.finish()
  
      @param logger: The L{eliot.ILogger} to which to write messages, or
          C{None} to use the default one.
  
      @param action_type: The type of this action,
          e.g. C{"yourapp:subsystem:dosomething"}.
  
      @param _serializers: Either a L{eliot._validation._ActionSerializers}
          instance or C{None}. In the latter case no validation or serialization
          will be done for messages generated by the L{Action}.
  
      @param fields: Additional fields to add to the start message.
  
      @return: A new L{Action}.