北宋陕州夏县(今属山西)人,字公休。司马光子。熙宁三年(1070),以明经擢上第。光修《资治通鉴》,奏为检阅文字。元丰八年(1085),韩绛荐为秘书省正字,迁校书郎。后为著作佐郎兼侍讲,充《神宗实录》检讨官。元右五年(1190),迁左司谏。旋病卒。